将JSON数据写入HttpWebRequest时收到“请求已取消”错误

时间:2013-06-19 15:29:56

标签: c# .net monodevelop xamarin

我使用Monodevelop用C#编写的iOS应用程序,作为应用程序的一部分,我调用了一个Web服务。 Web服务调用要求将JSON数据写入请求。但是,我第一次尝试写入数据时收到错误;所有后续调用具有相同参数的相同方法都有效。以下是相关代码的片段:

// Start snippet

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create (_connectionSettings.Uri);
request.Timeout = 15000; // milliseconds
if (_connectionSettings.Username != "") {
    request.Credentials = new NetworkCredential (_connectionSettings.Username, _connectionSettings.Password);
}

if (post) {
    request.Method = "POST";
    request.ContentType = "application/json";
    if (jsonData != null) {
        byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(jsonData);
        request.ContentLength = byteArray.Length;    
        using (Stream ds = request.GetRequestStream()) {  //<--- ERROR HERE
            ds.Write (byteArray, 0, byteArray.Length);
        }
    } else {
        request.Method = "GET";
}

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) {

// end snippet

我得到的错误如下:

  

System.Net.WebException:请求已取消。 ---&GT;   System.Exception的:   在写入所有字节之前无法关闭流   ---内部异常堆栈跟踪结束---在

     

System.Net.WebConnectionStream.Close()   <0x00121]在

中      

/Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/WebConnectionStream.cs:785   在

中的System.IO.Stream.Dispose()[0x00000]      

/Developer/MonoTouch/Source/mono/mcs/class/corlib/System.IO/Stream.cs:93   在

     

MyCustomMethod(System.String&amp; responseString,System.String jsonData,Boolean post,   /Path/To/My/Class.cs:192中的布尔值suppressAlert)[0x00101]

任何想法我可能做错了什么?

修改

好的,显然在单步执行应用程序时,该方法每次都有效。我注意到的是,当抛出错误时,尽管byteArray.Length非零,request.ContentLength仍为零。但是,当单步执行应用程序时,request.ContentLength保持byteArray.Length的预期值。

1 个答案:

答案 0 :(得分:4)

好的,看起来我们根本不需要设置request.ContentLength。删除行:

request.ContentLength = byteArray.Length;

完全解决了这个问题。我仍然很好奇这是否是库中的错误,因为大多数代码示例都显示设置了HttpWebRequest的ContentLength,并且它在后续尝试中正常工作。