Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xamarin iOS WebException:HttpWebRequest完成后应用程序崩溃 问题_C#_Asynchronous_Xamarin.ios_Httpwebrequest_Httpwebresponse - Fatal编程技术网

C# Xamarin iOS WebException:HttpWebRequest完成后应用程序崩溃 问题

C# Xamarin iOS WebException:HttpWebRequest完成后应用程序崩溃 问题,c#,asynchronous,xamarin.ios,httpwebrequest,httpwebresponse,C#,Asynchronous,Xamarin.ios,Httpwebrequest,Httpwebresponse,因此,我们正在创建一个Xamarin iOS应用程序,该应用程序将连接到ASP.NET上运行的REST API。为了执行httprequest,它使用了一个我们在iOS应用程序和android应用程序之间共享的库 乍一看,一切正常。iOS应用程序从我们的库调用异步方法,从服务器接收数据,并在表视图中正确显示数据。然而,由于某些原因,一旦连接完成,它就不会终止连接,导致一段时间后出现WebException(从请求执行后的第一时间到几分钟后似乎是随机的)说获取响应流时出错(ReadDoneAsyn

因此,我们正在创建一个Xamarin iOS应用程序,该应用程序将连接到ASP.NET上运行的REST API。为了执行httprequest,它使用了一个我们在iOS应用程序和android应用程序之间共享的库

乍一看,一切正常。iOS应用程序从我们的库调用异步方法,从服务器接收数据,并在表视图中正确显示数据。然而,由于某些原因,一旦连接完成,它就不会终止连接,导致一段时间后出现
WebException
(从请求执行后的第一时间到几分钟后似乎是随机的)说
获取响应流时出错(ReadDoneAsync2):ReceiveFailure
。有趣的是,当我们从控制台应用程序调用库中完全相同的方法时,一切都正常

库代码 这是我们库中的相关代码(我们不知道错误发生在哪里,因为主UI线程崩溃。调试也没有发现任何可疑的东西。因此,我将在下面列出我们在API调用期间在客户端上执行的所有代码):

俱乐部供应商:

公共类ClubProvider:BaseProvider
{
/// 
///使用指定的属性创建新的。
/// 
内部ClubProvider(字符串uri)
{
如果(!uri.EndsWith(“/”)
{
uri+=“/”;
}
Uri=Uri+“俱乐部”;
}
公共异步任务GetClubListAsync()
{
返回等待接收服务响应同步(Uri);
}
}
BaseProvider(执行实际HttpWebRequest的位置)

公共抽象类BaseProvider
{
公共虚拟字符串Uri{get;私有保护集;}
/// 
///将的响应流作为UTF-8字符串读取。
/// 
专用异步任务ReadResponseStreamAsync(HttpWebResponse webResponse)
{
常量int bufferSize=4096;
使用Stream responseStream=webResponse.GetResponseStream();
StringBuilder=新的StringBuilder();
字节[]缓冲区=新字节[bufferSize];
int字节读取;
while((bytesRead=wait responseStream.ReadAsync(buffer,0,bufferSize))!=0)
{
Append(Encoding.UTF8.GetString(buffer,0,bytesRead));
}
返回builder.ToString();
}
/// 
///使用提供的执行,并返回结果对象。
/// 
专用异步任务GetResponseAsync(HttpWebRequest webRequest,T有效负载)
{
webRequest.Host=“ClubmappClient”;
如果(有效负载!=null)
{
webRequest.ContentType=“应用程序/json”;
字符串jsonPayload=JsonConvert.SerializeObject(有效负载);
ReadOnlyMemory payloadBuffer=Encoding.UTF8.GetBytes(jsonPayload);
webRequest.ContentLength=payloadBuffer.Length;
使用Stream requestStream=webRequest.GetRequestStream();
wait requestStream.WriteAsync(payloadBuffer);
}
其他的
{
webRequest.ContentLength=0;
}
HttpWebResponse-webResponse;
尝试
{
webResponse=(HttpWebResponse)等待webRequest.GetResponseAsync();
}
捕获(WebE例外)
{
/*错误处理
....
*/
}
返回webResponse;
}
/// 
///使用提供的执行,并返回结果的主体。
/// 
专用异步任务GetJsonResponseAsync(HttpWebRequest webRequest,T有效负载)
{
使用HttpWebResponse-webResponse=wait-GetResponseAsync(webRequest,payload);
返回等待ReadResponseStreamAsync(webResponse);
}
/// 
///使用提供给位于的指定终结点的执行。结果将反序列化并作为返回。
/// 
私有保护异步任务ReceiveServiceResponseAsync(字符串uri,T有效负载),其中TResult:IResponse
{
HttpWebRequest-webRequest=webRequest.CreateHttp(uri);
webRequest.Method=“POST”;
string json=await GetJsonResponseAsync(webRequest,payload);
TResult result=JsonConvert.DeserializeObject(json);
返回结果;
}
/// 
///对处的指定终结点执行。结果将反序列化并作为返回。
/// 
私有保护异步任务ReceiveServiceResponseAsync(字符串uri),其中TResult:IResponse
{
return wait-wait-ReceiveServiceResponseAsync(uri,null);
}
}
来自iOS客户端的呼叫
public async override void ViewDidLoad()
{
// ...
ServiceProviderFactory ServiceProviderFactory=新的ServiceProviderFactory(“https://10.0.0.40:5004/api");
ClubProvider ClubProvider=serviceProviderFactory.GetClubProvider();
ClubListResponse ClubListResponse=等待clubProvider.GetClubListAsync();
var clublist=新列表();
foreach(clublisresponse.clublistanteries中的var条目)
{
添加(新的ClubProfileListData(entry.Name,entry.City+”,“+entry.Country,entry.MusicGenres.Aggregate(new-StringBuilder(),(builder,current)=>builder.Append(current.Append(,”).ToString());
}
// ...
}
起初,这似乎工作得很好,但随后会出现以下错误消息:

通过Wireshark查看执行的请求,可以发现连接从未终止:

连接保持打开状态,直到应用程序崩溃,我们关闭模拟器。 有趣的是,该应用程序并不总是立即崩溃。我们将接收到的数据加载到TableView中,每隔一段时间应用程序在加载数据后不会崩溃。只有当我们开始滚动结果时,它才会崩溃。这对我们来说毫无意义,因为所有的网络流现在都应该关闭了,对吗?(毕竟,我们对所有
响应团队使用
语句