![](/img/trans.png)
[英]Windows phone 8 dev: HttpWebRequest.BeginGetResponse callback never called
[英]HttpWebRequest BeginGetRequestStream callback never called
在我的Xamarin应用程序中,我使用HttpWebRequest类将POST消息发送到服务器(之所以使用它,是因为它在PCL库中是开箱即用的)。
这是一些请求准备代码:
request.BeginGetRequestStream (asyncResult => {
Mvx.Trace ("BeginGetRequestStream callback");
request = (HttpWebRequest)asyncResult.AsyncState;
Stream postStream = request.EndGetRequestStream (asyncResult);
string postData = jsonConverter.SerializeObject (objectToSend);
Mvx.Trace ("Posting following JSON: {0}", postData);
byte[] byteArray = Encoding.UTF8.GetBytes (postData);
postStream.Write (byteArray, 0, byteArray.Length);
MakeRequest (request, timeoutMilliseconds, successAction, errorAction);
}, request);
当我启动应用程序并第一次和第二次执行此代码时,一切正常。 但是,当它第三次执行时(恰好!),不会调用该回调,并且永远不会将“ BeginGetRequestStream回调”行打印到日志中。 这是类实现中的错误,还是我做错了什么?
如果无法在Xamarin中使其正常工作,请建议使用可靠且方便的类来发送带有超时的Http GET和POST请求。
还创建了相关的更一般的问题: 从Xamarin便携式类库发送Http请求
我在Xamarin PCL中发送和接收消息JSON的解决方案:
public async Task<string> SendMessageJSON(string message, string url)
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(url));
request.ContentType = "application/json";
request.Method = "POST";
// Send data to server
IAsyncResult resultRequest = request.BeginGetRequestStream(null, null);
resultRequest.AsyncWaitHandle.WaitOne(30000); // 30 seconds for timeout
Stream streamInput = request.EndGetRequestStream(resultRequest);
byte[] byteArray = Encoding.UTF8.GetBytes(message);
await streamInput.WriteAsync(byteArray, 0, byteArray.Length);
await streamInput.FlushAsync();
// Receive data from server
IAsyncResult resultResponse = request.BeginGetResponse(null, null);
resultResponse.AsyncWaitHandle.WaitOne(30000); // 30 seconds for timeout
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(resultResponse);
Stream streamResponse = response.GetResponseStream();
StreamReader streamRead = new StreamReader(streamResponse);
string result = await streamRead.ReadToEndAsync();
await streamResponse.FlushAsync();
return result;
}
最终通过切换到Profile 78和HttpClient来解决此问题,该方法在所有情况下均适用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.