我最近为我们的应用程序编写了一个异步HttpWebRequest客户端,它在.NET 3.5中运行良好,但在Mono上,它无法在发送之前正确地将数据写入请求。
我已经确认使用wireshark来嗅探传出数据包的问题。使用JSON内容类型将HTTP请求正确设置为POST,但Content-Length和数据为0。
我目前有一个例外:
要写入的字节数大于指定的字节数 的ContentLength。
我试图通过手动设置WebRequest的ContentLength并在将数据提供给流之前更改数据编码的方式来解决这个问题(我已尝试过Steam和StreamWriter)。
我还介入了代码并调试了async方法中的变量,以确保数据确实存在。它似乎没有进入WebRequest对象。
以下是相关代码:
private void StartWebRequest(string payload) {
var httpWebRequest = (HttpWebRequest)WebRequest.Create(PortMapSleuthURL);
httpWebRequest.ContentType = "text/json";
httpWebRequest.Method = "POST";
httpWebRequest.Proxy = null; // Setting this to null will save some time.
// start an asynchronous request:
httpWebRequest.BeginGetRequestStream(GetRequestStreamCallback, new object[] {httpWebRequest, payload});
try {
// Send the request and response callback:
httpWebRequest.BeginGetResponse(FinishPortTestWebRequest, httpWebRequest);
} catch (Exception e) {
Console.WriteLine(e.Message);
PortTestException();
}
}
private void GetRequestStreamCallback(IAsyncResult asyncResult) {
try {
object[] args = (object[])asyncResult.AsyncState;
string payload = (string)args[1];
HttpWebRequest request = (HttpWebRequest)args[0];
//StreamWriter streamWriter = new StreamWriter(request.EndGetRequestStream(asyncResult), new UTF8Encoding(false));
StreamWriter streamWriter = new StreamWriter(request.EndGetRequestStream(asyncResult), Encoding.UTF8);
// Write to the request stream.
streamWriter.Write(payload);
streamWriter.Flush();
streamWriter.Close();
} catch (Exception e) {
Console.WriteLine(e.Message);
PortTestException();
}
}
答案 0 :(得分:1)
我认为你不应该在BeginGetResponse
之前致电EndGetRequestStream
。也就是说,我会把它移到GetRequestStreamCallback
。这就是example on msdn的工作方式。