簡體   English   中英

從未調用HttpWebRequest BeginGetRequestStream回調

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM