【问题标题】:C# HttpClient.PostAsync doesn't return or throw an errorC# HttpClient.PostAsync 不返回或抛出错误
【发布时间】:2020-07-13 11:13:39
【问题描述】:

我有一个 Windows 服务发出 HTTP POST 请求。 REST 端点正在工作,并且已单独测试。调用PostAsync 后,调试器不会继续或抛出错误。导致这种行为的可能问题是什么?下面是sn-p发送POST请求的代码,

编辑:我已将其更改为 async-await 并使用 ConfigureAWait,但这并没有解决问题。我需要知道是什么导致函数没有返回任何值。

HttpClientHandler handler = GetCookieHandler();
using(HttpClient client = new HttpClient(handler)) {
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("basic", accessToken);

    client.DefaultRequestHeaders.Add("UniqueId", _configReader.UniqueId);

    SetRequestCookie(handler);

    string jsonContent = JsonConvert.SerializeObject(content);

    HttpResponseMessage response = client.PostAsync(url, new StringContent(jsonContent, Encoding.UTF8, "application/json")).Result;

    SaveCookie(handler, response.RequestMessage.RequestUri);

    if (response.StatusCode == HttpStatusCode.Unauthorized) {
        var customerJsonString = response.Content.ReadAsStringAsync().Result;

        Error data = JsonConvert.DeserializeObject < Error > (customerJsonString);

        switch (data.ErrorCode) {
        case AccessTokenValidationCodes.ExpiredOrInvalidDateTime:
            logger.Warn("Expired AccessToken");
            break;

        default:
            break;
        }
    }

    if (response.StatusCode == HttpStatusCode.Unauthorized) {
        logger.Error("Request :{0}, AccessToken {1}  response Unauthorized", apirUrl, accessToken);
        return null;
    }
    if (response.StatusCode == HttpStatusCode.InternalServerError) {
        logger.Warn("Request response InternalServerError");
        return null;
    }
    return response;
}

【问题讨论】:

  • 这能回答你的问题吗? HttpClient PostAsync() never return response
  • 我在发布之前查看了这个,但更改为 async-await 和 ConfigureAwait(false) 并没有做太多。
  • 能否包含函数的签名。而且,顺便说一句;在大多数情况下,最好添加异步等待模式。
  • public HttpResponseMessage PostSync(string apirUrl, object content) 这是函数签名

标签: c# http windows-services


【解决方案1】:

除了我的重复评论,您需要阅读最后的回复。目前,您仅在未经授权的情况下执行此操作,但无论如何您都应该阅读以结束。确保您使用the advice from the comment,包括异步等待,以及:

将 ReadAsString 行移出并确保它对端点的所有调用都运行。

 HttpResponseMessage response = client.PostAsync(url, new StringContent(jsonContent, Encoding.UTF8, "application/json")).Result; 
 var customerJsonString = response.Content.ReadAsStringAsync().Result;

你的代码

if (response.StatusCode == HttpStatusCode.Unauthorized) {
        var customerJsonString = response.Content.ReadAsStringAsync().Result;

        Error data = JsonConvert.DeserializeObject < Error > (customerJsonString);

        switch (data.ErrorCode) {    
            case AccessTokenValidationCodes.ExpiredOrInvalidDateTime:
                logger.Warn("Expired AccessToken");
                break;

            default:
                break;
        }

【讨论】:

  • 调试器在.PostAsync之后没有执行,调用堆栈就消失了,所以我猜这个问题与我如何调用.PostAsync()有关,而不是我如何得到结果?
  • 我建议您转换为完整的异步模式。您可以测试并尝试将异步代码包装在 Task.Run() 中。 stackoverflow.com/questions/14435520/…stackoverflow.com/questions/53529061/… 并尝试获取不同的端点...
猜你喜欢
  • 2019-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
相关资源
最近更新 更多