【问题标题】:HttpClient fails on certain requestsHttpClient 在某些请求上失败
【发布时间】:2015-07-09 22:11:03
【问题描述】:

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

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

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

下面是我用来调用网络服务的代码。我已经尝试过 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;

                }
            }
        }
    }

有人知道为什么会这样吗?

【问题讨论】:

  • 可能与请求/响应的大小有关。检查您的HttpClient.MaxResponseContentBufferSize。我相信 web.config 中也可能有一个设置,但我目前找不到任何相关信息。这里还有另一种可能的解决方案...stackoverflow.com/questions/18720435/…
  • 发布异常 ToString。此外,挂接 Fiddler 作为代理,并确保应用正在接收您期望的内容。
  • 您的代码中的HttpClient 是什么?该对象定义未显示。
  • @DavidG HttpClient 只是 HttpClient 对象。例如 HttpClient httpClient = new HttpClient();
  • @JamesReeves 这很令人困惑,因为httpClient 不等于HttpClient(注意大写)

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


【解决方案1】:

如果它是被抛出的 AggregateExeption,那么它几乎肯定是在:

HttpClient.PostAsync(uri, content).Result;

或:

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

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

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

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

【讨论】:

    【解决方案2】:

    如果您使用的是 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;
        }
    }
    

    【讨论】:

    • 不,它没有用。它得到了 var response = await client.PostAsync(uri, content);然后继续应用程序 - 甚至在结果生成之前。
    • 这意味着 async/await 有问题,因为这不应该发生。您是否将 JobDetails() 修改为 await Task 而不仅仅是字符串?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多