下面的代码块说明了如何使用TCP和网络流发送HTTP请求.但是,无论应用什么过滤,每个请求都会持续消耗60秒的平均时间.无论是单个数据还是数千个数据到达,延迟都保持不变.为什么它会持续60秒?是否没有缩短此时间段的选项,或者是否有无需等待即可立即获取数据的设置?

// Specify the server and port
string server = "xxx.com";
int port = 80;

// Specify the HTTP request
string httpRequest = "POST /ApiPrefixNameHere/ControllerNameHere/ActionNameHere HTTP/1.1\r\nHost: xxx.com\r\naccept: text/plain\r\nContent-Type: application/json-patch+json\r\nContent-Length: 27\r\n\r\n{\"ParameterNameHere\":\"1580\"}";

// Create a TcpClient
using (TcpClient tcpClient = new())
{
    await tcpClient.ConnectAsync(server, port);

    using (NetworkStream networkStream = tcpClient.GetStream())
    using (StreamWriter writer = new(networkStream, Encoding.ASCII))
    using (StreamReader reader = new(networkStream, Encoding.ASCII))
    {
        // Send the HTTP request
        await writer.WriteAsync(httpRequest);
        await writer.FlushAsync();

        // Read the response
        string response = await reader.ReadToEndAsync();

        // Display the response
        Console.WriteLine("Response: " + response);
    }
}

我对这些老方法不太熟悉.我try 了NoDelay()和各种超时配置等策略,但没有一个被证明是有效的.

首先感谢您的帮助.


在@jonskeet的回答后编辑


// add `Connection: close`
string httpRequest = "POST /ApiPrefixNameHere/ControllerNameHere/ActionNameHere HTTP/1.1\r\nHost: xxx.com\r\naccept: text/plain\r\nContent-Type: application/json-patch+json\r\nConnection: close\r\nContent-Length: 28\r\n\r\n{\"ParameterNameHere\":\"1580\"}";

推荐答案

我可以在您的特定代码中看到两个问题,但更普遍的是,我建议您不要使用TcpClient来处理HTTP请求,除非您使用absolutely have to.我相信,如果你使用HttpClient,这两个问题都可以避免.

首先,您将标头指定为Content-Length: 27--但在我看来,您发送的是28字节的内容.也许这只是样例代码中的一个问题,但它确实证明了这种方法是多么脆弱.

其次,您正在呼叫StreamReader.ReadToEnd,这意味着您正在等待连接关闭.您没有关闭连接,这意味着您预期服务器会关闭它.但在HTTP/1.1(您正在指定的版本)中,默认行为是保持连接处于活动状态.因此,我强烈怀疑您看到的是服务器立即发送响应,然后在等待下一个请求一分钟后超时.

为了避免这种情况,您可以发送标题为Connection: close...或者,最好使用HttpClient,这样您就不需要知道HTTP的详细信息.

Csharp相关问答推荐

Microsoft.AspNetCore.Mvc. Controller Base.用户:属性或索引器Controller Base.用户无法分配给--它是只读的

为什么.Equals(SS,StringComparison. ClientCultureIgnoreCase)在Net 4.8和6.0之间不同?

EF Core在请求列表时忽略列,但在按ID获取时包含

需要澄清C#的Clean Architecture解决方案模板的AuditableEntityInterceptor类

实现List T,为什么LINQ之后它不会返回MyList?<>(无法强制转换WhereListIterator `1类型的对象)'

如何在NodaTime中为Instant添加一年?

C#EF Core 8.0表现与预期不符

Azure DEVOPS找不到定制的Nuget包

注册所有IMediatR类

使用预定义对象减少Task.Run/Factory.StartNew中的关闭开销

MigraDoc文档

如何注册类使用多级继承与接口

在swagger示例中添加默认数组列表

在C#中反序列化/序列化具有混合元素顺序的XML时出现问题

同一组件的多个实例触发相同的事件处理程序

用C#从XML内部元素中获取特定值

将FileStream的特定部分作为字节数组读取

如何从非异步任务中正确返回TypeResult

ASP.NET Core 8 Web API:如何添加版本控制?

如何根据分割文本的块数来计算文本的大小?