Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有xml请求消息的C#WP8异步HttpWebRequest Post_C#_.net_Windows Phone 8_Httpwebrequest_Async Await - Fatal编程技术网

带有xml请求消息的C#WP8异步HttpWebRequest Post

带有xml请求消息的C#WP8异步HttpWebRequest Post,c#,.net,windows-phone-8,httpwebrequest,async-await,C#,.net,Windows Phone 8,Httpwebrequest,Async Await,我在这里读了很长一段时间,但在这种情况下,我没有得到任何进一步。 我对Windows Phone开发相当陌生,面临以下问题 如果我必须发布一条xml请求消息,我将调用一个Web服务。我已经让代码在常规c#中工作(请参见下面的代码) 但是对于WindowsPhone(8)开发,它需要是异步的。在搜索web并尝试此处提供的各种示例后,我得到了以下代码: private async void DoCallWS() { string url = "<my_url>";

我在这里读了很长一段时间,但在这种情况下,我没有得到任何进一步。 我对Windows Phone开发相当陌生,面临以下问题

如果我必须发布一条xml请求消息,我将调用一个Web服务。我已经让代码在常规c#中工作(请参见下面的代码)

但是对于WindowsPhone(8)开发,它需要是异步的。在搜索web并尝试此处提供的各种示例后,我得到了以下代码:

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();
        }
    }
}
private异步void DoCallWS()
{
字符串url=“”;
//HTTP web请求
var httpWebRequest=(httpWebRequest)WebRequest.Create(url);
httpWebRequest.ContentType=“text/xml”;
httpWebRequest.Method=“POST”;
//异步写入请求
使用(var stream=await Task.Factory.fromsync(httpWebRequest.BeginGetRequestStream,
httpWebRequest.EndGetRequestStream,空)
{
字符串requestXml=“”;
//将请求转换为字节数组
byte[]requestAsBytes=Encoding.UTF8.GetBytes(requestXml);
//将字节写入流
wait stream.WriteAsync(requestAsBytes,0,requestAsBytes.Length);
流位置=0;
使用(StreamReader=newstreamreader(stream,Encoding.UTF8))
{
//返回reader.ReadToEnd();
字符串结果=reader.ReadToEnd();
}
}
}
字符串结果具有我试图发送的请求xml消息的值

我知道异步void方法不是首选方法,但我稍后会解决这个问题

我还尝试遵循Matthias Shapiro()所描述的解决方案,但这导致代码崩溃

请给我指出正确的方向:)


Thnx Frank

您所做的只是写入请求流。您缺少从响应读取的代码

返回请求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;
    }
}
专用异步任务DoCallWSAsync()
{
字符串url=“”;
//HTTP web请求
var httpWebRequest=(httpWebRequest)WebRequest.Create(url);
httpWebRequest.ContentType=“text/xml”;
httpWebRequest.Method=“POST”;
//异步写入请求
使用(var stream=await Task.Factory.fromsync(httpWebRequest.BeginGetRequestStream,
httpWebRequest.EndGetRequestStream,空)
{
字符串requestXml=“”;
//将请求转换为字节数组
byte[]requestAsBytes=Encoding.UTF8.GetBytes(requestXml);
//将字节写入流
wait stream.WriteAsync(requestAsBytes,0,requestAsBytes.Length);
}
使用(WebResponse responseObject=await Task.Factory.FromAsync(httpWebRequest.BeginGetResponse,httpWebRequest.EndGetResponse,httpWebRequest))
{
var responseStream=responseObject.GetResponseStream();
var sr=新的StreamReader(responseStream);
接收到字符串=等待sr.ReadToEndAsync();
收到的报税表;
}
}

您所做的只是写入请求流。您缺少从响应读取的代码

返回请求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;
    }
}
专用异步任务DoCallWSAsync()
{
字符串url=“”;
//HTTP web请求
var httpWebRequest=(httpWebRequest)WebRequest.Create(url);
httpWebRequest.ContentType=“text/xml”;
httpWebRequest.Method=“POST”;
//异步写入请求
使用(var stream=await Task.Factory.fromsync(httpWebRequest.BeginGetRequestStream,
httpWebRequest.EndGetRequestStream,空)
{
字符串requestXml=“”;
//将请求转换为字节数组
byte[]requestAsBytes=Encoding.UTF8.GetBytes(requestXml);
//将字节写入流
wait stream.WriteAsync(requestAsBytes,0,requestAsBytes.Length);
}
使用(WebResponse responseObject=await Task.Factory.FromAsync(httpWebRequest.BeginGetResponse,httpWebRequest.EndGetResponse,httpWebRequest))
{
var responseStream=responseObject.GetResponseStream();
var sr=新的StreamReader(responseStream);
接收到字符串=等待sr.ReadToEndAsync();
收到的报税表;
}
}

您所做的只是写入请求流。您缺少从响应读取的代码

返回请求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;
    }
}
专用异步任务DoCallWSAsync()
{
字符串url=“”;
//HTTP web请求
var httpWebRequest=(httpWebRequest)WebRequest.Create(url);
httpWebRequest.ContentType=“text/xml”;
httpWebRequest.Method=“POST”;
//异步写入请求
使用(var stream=await Task.Factory.fromsync(httpWebRequest.BeginGetRequestStream,
httpWebRequest.EndGetRequestStream,空)
{
字符串requestXml=“”;
//将请求转换为字节数组
byte[]requestAsBytes=Encoding.UTF8.GetBytes(requestXml);
//将字节写入流
wait stream.WriteAsync(requestAsBytes,0,requestAsBytes.Length);
}
使用(WebResponse responseObject=await Task.Factory.FromAsync(httpWebRequest.BeginGetResponse,httpWebRequest.EndGetResponse,httpWebRequest))
{
var responseStream=responseObject.GetResponseStream();
var sr=新的StreamReader(responseStream);
接收到字符串=等待sr.ReadToEndAsync();
收到的报税表;
}
}