HttpClient在某些请求上失败

时间:2015-07-09 22:11:04

标签: c# asp.net-mvc-4 dotnet-httpclient

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

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

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

以下是我用来调用Web服务的代码。我试过Async / Await,但没有什么区别。

 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 Post

的代码
   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);
    }

然后填充前端的DataTable。

对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;

                }
            }
        }
    }

有谁知道为什么会这样?

2 个答案:

答案 0 :(得分:0)

如果它是抛出的AggregateExeption,那么它几乎肯定是在以下内容中引起的:

HttpClient.PostAsync(uri, content).Result;

或:

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

我说这是根据我的经验,通常会在任务中引发AggregateExceptions。

如果不知道您要发布的内容以及您尝试发布的API,我无法说明具体错误是什么。 我的第一个检查是在导致错误的请求中没有拼写错误或其他此类错误。 然后我会检查是否有任何对包含保留关键字,因为这也可能是一个问题。

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

答案 1 :(得分: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;
    }
}