C# “收到”;“请求已被取消”;将JSON数据写入HttpWebRequest时出错
我使用Monodevelop编写了一个用C#编写的iOS应用程序,作为应用程序的一部分,我调用了一个web服务。web服务调用要求将JSON数据写入请求。但是,我第一次尝试写入数据时收到一个错误;使用相同参数对相同方法的所有后续调用都有效。以下是相关代码的一个片段:C# “收到”;“请求已被取消”;将JSON数据写入HttpWebRequest时出错,c#,.net,monodevelop,xamarin,C#,.net,Monodevelop,Xamarin,我使用Monodevelop编写了一个用C#编写的iOS应用程序,作为应用程序的一部分,我调用了一个web服务。web服务调用要求将JSON数据写入请求。但是,我第一次尝试写入数据时收到一个错误;使用相同参数对相同方法的所有后续调用都有效。以下是相关代码的一个片段: //开始代码段 HttpWebRequest request=(HttpWebRequest)HttpWebRequest.Create(_connectionSettings.Uri); 请求。超时=15000;//毫秒 如果(_
//开始代码段
HttpWebRequest request=(HttpWebRequest)HttpWebRequest.Create(_connectionSettings.Uri);
请求。超时=15000;//毫秒
如果(_connectionSettings.Username!=“”){
request.Credentials=新的网络凭据(_connectionSettings.Username,_connectionSettings.Password);
}
如果(员额){
request.Method=“POST”;
request.ContentType=“application/json”;
if(jsonData!=null){
byte[]byteArray=System.Text.Encoding.UTF8.GetBytes(jsonData);
request.ContentLength=byteArray.Length;
使用(Stream ds=request.GetRequestStream()){//
系统。例外情况:
在写入所有字节之前,无法关闭流
---内部异常堆栈跟踪的结束---at
System.Net.WebConnectionStream.Close()
[0x00121]英寸
/开发者/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&responseString、System.String jsonData、Boolean post、,
/Path/To/My/Class.cs:192中的布尔suppressAlert)[0x00101]
知道我做错了什么吗
编辑
好的,很明显,在单步执行应用程序时,该方法每次都有效。我注意到,当抛出错误时,request.ContentLength为零,尽管byteArray.Length不为零。但是,在单步执行应用程序时,request.ContentLength保留了byteArray的预期值.Length。好的,看起来我们根本不需要设置request.ContentLength。删除行:
request.ContentLength = byteArray.Length;
完全修复了该问题。我仍然很好奇这是否是库中的一个错误,因为大多数代码示例显示设置HttpWebRequest的ContentLength,并且它在后续尝试中正常工作。好的,看起来我们根本不需要设置request.ContentLength。删除该行:
request.ContentLength = byteArray.Length;
完全修复了这个问题。我仍然很好奇这是否是库中的一个bug,因为大多数代码示例显示设置HttpWebRequest的ContentLength,并且它在后续尝试中正常工作。您可以尝试使用(Stream ds=request.GetRequestStream()更改语句吗{//@srsyogesh,感谢您的回复。接受这些参数的StreamWriter.Write没有重载。但是,使用ds.Write(byteArray)会引发错误“System.Net.ProtocolViolationException-要写入的字节数大于指定的ContentLength”似乎发生了我在编辑中提到的相同问题,特别是request.ContentLength有一个零值,即使byteArray.Length不是零。可以设置request.ContentLength=byteArray.Length来解决这个问题吗?不确定只是一个查看异常的想法,或者正如您在编辑中提到的,这两个值已经相同了??@srsyogesh是,在使用之前(流ds=request.GetRequestStream())我设置了request.ContentLength=byteArray.Length。在该位置放置断点,我看到request.ContentLength的值确实等于byteArray.Length。但是,当我恢复应用程序并抛出后续错误时,request.ContentLength的值则为零。有趣的是,如果我不恢复应用程序但是在应用程序中,request.ContentLength仍然等于byteArray.Length,应用程序可以工作!如图所示。您可以尝试使用(Stream ds=request.GetRequestStream()更改语句吗{//@srsyogesh,感谢您的回复。接受这些参数的StreamWriter.Write没有重载。但是,使用ds.Write(byteArray)会引发错误“System.Net.ProtocolViolationException-要写入的字节数大于指定的ContentLength”似乎发生了我在编辑中提到的相同问题,特别是request.ContentLength有一个零值,即使byteArray.Length不是零。可以设置request.ContentLength=byteArray.Length来解决这个问题吗?不确定只是一个查看异常的想法,或者正如您在编辑中提到的,这两个值已经相同了??@srsyogesh是,在使用之前(流ds=request.GetRequestStream())我设置了request.ContentLength=byteArray.Length。在该位置放置断点,我看到request.ContentLength的值确实等于byteArray.Length。但是,当我恢复应用程序并抛出后续错误时,request.ContentLength的值则为零。有趣的是,如果我不恢复应用程序但是,在应用程序中,request.ContentLength仍然等于byteArray.Length,应用程序可以运行!Go figure.msdn说在发送数据的地方需要这样做(),但您是对的,在Xamarin上删除该行可以解决问题。msdn说在发送数据的地方需要这样做(),但你是对的,在Xamarin上删除该行可以解决问题。