C#异步GetWebRequest无法POST数据

时间:2014-12-14 07:55:46

标签: c# asynchronous mono httpwebrequest streamwriter

我最近为我们的应用程序编写了一个异步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();
    }
}

1 个答案:

答案 0 :(得分:1)

我认为你不应该在BeginGetResponse之前致电EndGetRequestStream。也就是说,我会把它移到GetRequestStreamCallback。这就是example on msdn的工作方式。