![](/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.