2015-07-09 143 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