gpt4 book ai didi

.net - 什么可能导致进行 HttpWebRequest 调用的巨大开销?

转载 作者:可可西里 更新时间:2023-11-01 15:20:51 25 4
gpt4 key购买 nike

当我使用 HttpWebRequest(在 Silverlight 上)以小块形式发送/接收数据时,我测量了 500 字节/的非常小的吞吐量通过“本地主机”连接。当以大块发送数据时,我得到了 2 MB/s,这比 快了 5000 倍

有谁知道什么会导致如此巨大的开销?

附加信息:

  • 我正在使用 HTTP POST 方法
  • 我在 Firefox 3.6 和 Internet Explorer 7 上进行了性能测量。两者的结果相似。
  • 我的 CPU 只加载了 10%(四核,所以实际上是 40%)
  • WebClient 显示了相似的结果
  • WCF/SOAP showed similar results

更新:我使用的 Silverlight 客户端代码基本上是我自己实现的 WebClient 类。我写它的原因是因为我注意到 WebClient 存在相同的性能问题,并且我认为 HttpWebRequest 将允许调整性能问题。遗憾的是,这没有用。实现如下:

public class HttpCommChannel
{
public delegate void ResponseArrivedCallback(object requestContext, BinaryDataBuffer response);

public HttpCommChannel(ResponseArrivedCallback responseArrivedCallback)
{
this.responseArrivedCallback = responseArrivedCallback;
this.requestSentEvent = new ManualResetEvent(false);
this.responseArrivedEvent = new ManualResetEvent(true);
}

public void MakeRequest(object requestContext, string url, BinaryDataBuffer requestPacket)
{
responseArrivedEvent.WaitOne();
responseArrivedEvent.Reset();

this.requestMsg = requestPacket;
this.requestContext = requestContext;

this.webRequest = WebRequest.Create(url) as HttpWebRequest;
this.webRequest.AllowReadStreamBuffering = true;
this.webRequest.ContentType = "text/plain";
this.webRequest.Method = "POST";

this.webRequest.BeginGetRequestStream(new AsyncCallback(this.GetRequestStreamCallback), null);
this.requestSentEvent.WaitOne();
}

void GetRequestStreamCallback(IAsyncResult asynchronousResult)
{
System.IO.Stream postStream = webRequest.EndGetRequestStream(asynchronousResult);

postStream.Write(requestMsg.Data, 0, (int)requestMsg.Size);
postStream.Close();

requestSentEvent.Set();
webRequest.BeginGetResponse(new AsyncCallback(this.GetResponseCallback), null);
}

void GetResponseCallback(IAsyncResult asynchronousResult)
{
HttpWebResponse response = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult);
Stream streamResponse = response.GetResponseStream();
Dim.Ensure(streamResponse.CanRead);
byte[] readData = new byte[streamResponse.Length];
Dim.Ensure(streamResponse.Read(readData, 0, (int)streamResponse.Length) == streamResponse.Length);
streamResponse.Close();
response.Close();

webRequest = null;
responseArrivedEvent.Set();
responseArrivedCallback(requestContext, new BinaryDataBuffer(readData));
}

HttpWebRequest webRequest;
ManualResetEvent requestSentEvent;
BinaryDataBuffer requestMsg;
object requestContext;
ManualResetEvent responseArrivedEvent;
ResponseArrivedCallback responseArrivedCallback;
}

我使用此代码将数据来回发送到 HTTP 服务器。

更新:经过大量研究,我得出结论 the performance problem is inherent to Silverlight v3 .

最佳答案

很可能您正在见证 Nagle 算法的效果,尝试:

this.webRequest.UseNagleAlgorithm.ServicePoint = false;

此外,Expect100Continue“握手”与 soap 服务调用性能相关:

this.webRequest.Expect100Continue.ServicePoint = false;

更新:

刚刚意识到 ServicePoint 在 Compact Framework 中不可用。但是,您可以通过以下方式证明这一点:

ServicePointManager.UseNagleAlgorithm = false

或者更改应用配置文件中的相关设置,或者 silverlight 中的任何等效设置?

关于.net - 什么可能导致进行 HttpWebRequest 调用的巨大开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2400949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com