2015-07-09 182 views
0

我可以向Web服务发出一些请求,并且它们工作正常 - 但是,这个返回错误消息。HttpClient在某些请求上失败

  • “一个或多个错误发生”
  • “的基础连接已关闭:接收时发生意外的错误。” “
  • ”无法从传输连接读取数据:现有的 连接被远程主机强制关闭。“

我调试了Web服务,它返回正确的JSON。

下面是我用来调用Web服务的代码。我尝试过异步/等待,但没有什么区别。

public static string PostURL(string uri, List<KeyValuePair<string, string>> pairs) 
    { 
     try 
     { 
      var content = new FormUrlEncodedContent(pairs); 
      var httpClient = new HttpClient(); 
      var response = httpClient.PostAsync(uri, content).Result; 
      if (response.IsSuccessStatusCode) 
       return response.Content.ReadAsStringAsync().Result.ToString(); 
      else 
       return "Failed"; 
     } 
     catch(AggregateException e) 
     { 
      return e.Message; 
     } 

    } 

这是代码调用HttpClient的邮政

public ActionResult JobDetails() 
    { 
     var response = WebServicePost.PostURL(WebServicePost.Uri + "JobService.svc/GetJob/", new List<KeyValuePair<String, String>> 
      { 
       new KeyValuePair<string, string>("JobID", "46"), 
       new KeyValuePair<string, string>("CompanyCode", System.Web.HttpContext.Current.Request.Cookies["CompanyCode"].Value) 
      }); 
     List<Job> list = (List<Job>)JsonConvert.DeserializeObject(response.ToString(), typeof(List<Job>)); 
     return View(list); 
    } 

位这然后填充在前端的一个数据表。

对Web服务的调用如下。

public List<Job> GetJob(Stream streamData) 
    { 
     dynamic jObject = streamReader.ConvertToDynamicJsonObject(streamData); 
     int jobID = int.Parse(jObject["JobID"]); 
     using (var session = NHibernateHelper.OpenSession()) 
     { 
      using (var transaction = session.BeginTransaction()) 
      { 
       try 
       { 
        var query = session.QueryOver<Job>().Where(x => x.JobID == jobID).List(); 
        return query.ToList(); 
       } 
       catch (Exception e) 
       { 
        Logger.log("Exception at GetJob", e.Message); 
        return null; 

       } 
      } 
     } 
    } 

有谁知道为什么会发生这种情况?

HttpClient.PostAsync(uri, content).Result; 

或:

+0

可能与请求/响应的大小有关。检查你的'HttpClient.MaxResponseContentBufferSize'。我相信在web.config中也可能有一个设置,但我目前无法找到任何信息。这里还有一个替代可能的解决方案... http://stackoverflow.com/questions/18720435/httpclient-buffer-size-limit-exceeded –

+0

发布异常ToString。此外,作为代理钩入Fiddler并确保应用程序正在接收您期望的内容。 – usr

+0

代码中的“HttpClient”是什么?该对象定义未显示。 – DavidG

回答

0

如果它是被抛出的AggregateExeption,则几乎可以肯定被内引起

response.Content.ReadAsStringAsync().Result.ToString(); 

我说这是我的经验AggregateExceptions都普遍提高在任务内。

不知道你想要发布什么,以及你试图发布到的API,我不能说具体的错误是什么。 我的第一个检查就是在导致错误的请求中没有错字或其他类似的错误。 然后我会检查是否有任何对包含保留关键字,因为这也可能是一个问题。

不是一个解决方案,但希望它有帮助。

0

如果您使用ReadAsStringAsync,是否需要另一个.ToString()?还想知道评估.Result两次是否提前关闭连接。我很好奇下面的解决方案是否适合你。

public async static Task<string> PostURL(string uri, List<KeyValuePair<string, string>> pairs) 
{ 
    try 
    { 
     var content = new FormUrlEncodedContent(pairs); 
     HttpClient client = new HttpClient(); 
     var response = await client.PostAsync(uri, content); 
     if (response.IsSuccessStatusCode) 
     { 
      string resp = await response.Content.ReadAsStringAsync(); 
      return resp; 
     } 
     else 
      return "Failed"; 
    } 
    catch (AggregateException e) 
    { 
     return e.Message; 
    } 
} 
+0

不,它没有工作。它得到了var response = await client.PostAsync(uri,content);然后继续使用应用程序 - 甚至在生成结果之前。 –

+0

这意味着异步/等待出现问题,因为这不应该发生。您是否修改了JobDetails()以等待任务而不是只是字符串? – codeMonkey