繁体   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