【问题标题】:HttpWebRequest BeginGetRequestStream callback never called从未调用过 HttpWebRequest BeginGetRequestStream 回调
【发布时间】:2014-03-22 01:03:09
【问题描述】:

在我的 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);

当我启动应用程序并第一次和第二次执行此代码时,一切正常。但是,当这是第 3 次执行时(完全正确!),不会调用回调,并且永远不会将“BeginGetRequestStream 回调”行打印到日志中。这是类实现中的错误还是我做错了什么?

如果无法使其在 Xamarin 中工作,请推荐可靠且方便的类,用于发送超时的 Http GET 和 POST 请求。

还创建了相关的更一般的问题:Sending Http requests from Xamarin Portable Class Library

【问题讨论】:

    标签: c# post httpwebrequest xamarin mvvmcross


    【解决方案1】:

    我在 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;
    }
    

    【讨论】:

      【解决方案2】:

      最后通过切换到 Profile 78 和 HttpClient 解决了这个问题,在所有情况下都运行良好。

      【讨论】:

        猜你喜欢
        • 2017-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多