簡體   English   中英

C#WP8異步HttpWebRequest發布與xml請求消息

[英]C# WP8 async HttpWebRequest Post with xml request message

我已經在這里閱讀了很長一段時間,但是在這種情況下,我沒有任何進一步的了解。 我是Windows Phone開發的新手,面臨以下問題。

我正在調用Web服務,因為我必須發布xml請求消息。 我的代碼在常規C#中工作(請參見下面的代碼)

private static string WebRequestPostData(string url, string postData)
{
    System.Net.WebRequest req = System.Net.WebRequest.Create(url);

    req.ContentType = "text/xml";
    req.Method = "POST";

    byte[] bytes = System.Text.Encoding.ASCII.GetBytes(postData);
    req.ContentLength = bytes.Length;

    using (Stream os = req.GetRequestStream())
    {
        os.Write(bytes, 0, bytes.Length);
    }

    using (System.Net.WebResponse resp = req.GetResponse())
    {
        if (resp == null) return null;
            using (System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream()))
        {
            return sr.ReadToEnd().Trim();
        }
    }
}

但是對於Windows Phone(8)開發,它需要是異步的。 在網上搜索並嘗試了此處給出的各種示例之后,我來到了以下代碼:

private async void DoCallWS()
{
    string url = "<my_url>";

        // HTTP web request
    var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
    httpWebRequest.ContentType = "text/xml";
    httpWebRequest.Method = "POST";

    // Write the request Asynchronously 
    using (var stream = await Task.Factory.FromAsync<Stream>(httpWebRequest.BeginGetRequestStream,
                                                                 httpWebRequest.EndGetRequestStream, null))
    {
        string requestXml = "<my_request_xml>";

        // convert request to byte array
        byte[] requestAsBytes = Encoding.UTF8.GetBytes(requestXml);

        // Write the bytes to the stream
        await stream.WriteAsync(requestAsBytes , 0, requestAsBytes .Length);

        stream.Position = 0;
        using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
        {
            //return reader.ReadToEnd();

            string result = reader.ReadToEnd();
        }
    }
}

字符串結果具有我嘗試發送的請求XML消息的值。

我知道異步void方法不是首選,但我稍后會解決。

我也嘗試遵循Matthias Shapiro( http://matthiasshapiro.com/2012/12/10/window-8-win-phone-code-sharing-httpwebrequest-getresponseasync/ )所述的解決方案,但這導致了代碼崩潰

請指出正確的方向:)

坦尼斯·弗蘭克

您正在執行的操作僅寫入請求流。 您缺少從響應中讀取的代碼。

返回請求xml的原因是您重置了請求流並從該精確流中讀取。

您的方法應如下所示:

private async Task DoCallWSAsync()
{
   string url = "<my_url>";

   // HTTP web request
   var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
   httpWebRequest.ContentType = "text/xml";
   httpWebRequest.Method = "POST";

   // Write the request Asynchronously 
   using (var stream = await Task.Factory.FromAsync<Stream>(httpWebRequest.BeginGetRequestStream,
                                                             httpWebRequest.EndGetRequestStream, null))
   {
       string requestXml = "<my_request_xml>";

       // convert request to byte array
       byte[] requestAsBytes = Encoding.UTF8.GetBytes(requestXml);

       // Write the bytes to the stream
       await stream.WriteAsync(requestAsBytes , 0, requestAsBytes .Length);
    }

    using (WebResponse responseObject = await Task<WebResponse>.Factory.FromAsync(httpWebRequest.BeginGetResponse, httpWebRequest.EndGetResponse, httpWebRequest))
    {
        var responseStream = responseObject.GetResponseStream();
        var sr = new StreamReader(responseStream);
        string received = await sr.ReadToEndAsync();

        return received;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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