2014-09-30 253 views
0

我想对某些服务器进行异步调用,以便主线程不会停止请求。c#异步http请求

我创造了我的要求是这样的:

//Create Request 
     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri); 
     request.Method = method; 
     request.ContentType = "application/XML"; 

     System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); 
     byte[] bytes = encoding.GetBytes(data); 

     request.ContentLength = bytes.Length; 

     try 
     { 
      using (Stream requestStream = request.GetRequestStream()) 
      { 
       // Send the data. 
       requestStream.Write(bytes, 0, bytes.Length); 
      } 

      request.BeginGetResponse((x) => 
      { 
       using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(x)) 
       { 
        if (callback != null) 
        { 
         callback(response.GetResponseStream()); 
        } 
       } 
      }, null); 
     } 
     catch (Exception ex) 
     { 
      //TODO: Log error 
     } 

但仍然是线程停止对该请求一段时间。特别是用

(Stream requestStream = request.GetRequestStream()) 

行有没有什么办法,使我们可以把它完全异步或一些其他更好的办法,使我们的主线程不会挂起该请求。

+0

当然 - 调用[GetRequestStreamAsync(http://msdn.microsoft.com/en-us/library/system.net.webrequest.getrequeststreamasync( v = vs.110).aspx)并等待结果。 – 2014-09-30 16:17:23

+1

如果可以的话,或者只是使用'HttpClient'和'await' - 它更加简洁。 – Luaan 2014-09-30 16:19:57

+0

[documentation](http://msdn.microsoft.com/en-us/library/d4cek6cc.aspx)说,如果您调用'GetRequestStream',那么您必须*调用'GetResponse'来获取响应。如果你想要一个使用'BeginGetResonse'的异步响应,那么你必须*调用'BeginGetRequeststream'来获取请求流。 – 2014-09-30 19:05:32

回答

0

需要使用异步方法并等待它们。

using (var stream = await request.GetRequestStreamAsync()) 
{ 
    await stream.WriteAsync(bytes, 0, bytes.Length); 
} 
0

这是一个简单的示例,我正在使用它来发出异步请求。马克与async keyword

using (var httpClient = new HttpClient()) 
{ 
    string requestContent = string.Empty; // JSON Content comes here 
    HttpContent httpContent = new StringContent(requestContent, Encoding.UTF8, "application/json"); 
    HttpRequestMessage httpRequestMessage = new HttpRequestMessage(Verb, url); 
    httpRequestMessage.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
    httpRequestMessage.Content = request.Verb == HttpMethod.Get ? null : httpContent; 
    response = httpClient.SendAsync(httpRequestMessage); 
    var responseContent = await response.Result.Content.ReadAsStringAsync(); 

你的方法}

1
using (HttpClient client = new HttpClient()) 
{ 
    var content = new StringContent(data, Encoding.UTF8, "application/xml"); 
    var response = await client.PostAsync(uri, content); 
    var respString = await response.Content.ReadAsStringAsync(); 
} 
+0

我在这里有点困惑。在请求中,我们通过等待等待实际等待响应。此外,如果方法A()发出请求,那么我们必须通过等待任务A()来调用,然后等待响应。仅使其同步。 – user2692032 2014-10-01 06:13:09

+0

@ user2692032 [在异步方法中发生了什么](http://msdn.microsoft.com/zh-cn/library/hh191443.aspx) – EZI 2014-10-01 07:16:31