2016-03-01 44 views
2

如何使用相同的服务发出多个请求?一个连接多个请求Rest服务

我创建了一个静态的HttpWebRequest:

private static HttpWebRequest request; 
    //private static StreamReader streamReader; 
    //private StreamWriter streamWriter; 

    public CentralRestService2(LogFile log) 
    { 
     if (request == null) 
     { 
      request = (HttpWebRequest)WebRequest.Create("service address"); 
      request.Method = "POST"; 
      request.Accept = "*/*"; 
      request.ContentType = "application/json"; 
      request.Headers["Authorization"] = "username and password"; 
      request.KeepAlive = true; 
     } 

     using (var streamWriter = new StreamWriter(request.GetRequestStream())) 
     { 
      string body = new JavaScriptSerializer().Serialize(emailRequest); 
      streamWriter.Write(body); 

     } 

     using (var streamReader = new StreamReader(response.GetResponseStream())) 
     { 
      var result = streamReader.ReadToEnd(); 
     } 
     response.Close(); 
    } 

我得到错误信息包括流不能被写入。连接意外关闭。我似乎无法在任何地方找到答案!

+0

处置使用蒸汽,尝试没有使用,只是手动关闭它们完成时。 – Jacobr365

+1

@ Jacobr365,不确定在这种情况下会起作用。请求流应该是只前向/只写流,就像响应流是只前向/只读流一样。只适用于一种用途。 REST的整个概念是一个请求/响应对完全独立和独立。 – Kevin

+0

有没有办法对所有请求使用一个打开的连接?我也试过雅各布 - 它也不行 - 它创建了连接关闭的消息。 – markthewizard1234

回答

0

请勿创建静态HttpWebRequest
请求不代表连接,但它使用ServicePointManager为您管理底层TCP连接。
每次需要发送请求时,只需创建一个新的HttpWebRequest实例。

UPDATE:
如果您想为您服务的客户端,你应该使用HttpClient代替:

// add reference to System.Net.Http and System.Net.Http.Formatting 
using System.Net.Http; 

// with a handler you can configure the client and its behavior 
var handler = new HttpClientHandler(); 
var httpClient = new HttpClient(handler); 
httpClient.BaseAddress = new Uri("service address"); 
httpClient.DefaultRequestHeaders.Add("Authorization", "username and password"); 
var response = await httpClient.PostAsJsonAsync(httpClient.BaseAddress, emailRequest);