【问题标题】:HttpClient throws unexpected ThrowForNonSuccess [closed]HttpClient 抛出意外的 ThrowForNonSuccess [关闭]
【发布时间】:2019-02-15 12:22:01
【问题描述】:

有以下代码适用于目标框架.net core 2.2 目标框架 4.5 存在问题。

public async Task<string> GetConversationIdAsync()
    {
        try
        {
            var client = new HttpClient();
            var content = new StringContent(" ", Encoding.UTF8, "application/json");
            client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Authorization
                = new AuthenticationHeaderValue("Bearer", "XXXXXXXXXXXX");

            var response = await client.PostAsync(
                $"https://directline.botframework.com/v3/directline/conversations", content);///Error here

            var result = await response.Content.ReadAsStringAsync();
            return result;
        }
        catch (Exception ex)
        {

            throw;
        }

    }

这个错误来了: 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 在 OlyBot.Api.BLL.Handoff.d__1.MoveNext()

这里有什么问题

我也试过

System.Net.WebRequest webRequest = System.Net.WebRequest.Create("https://directline.botframework.com/v3/directline/conversations");
                webRequest.Method = "POST";
                webRequest.Headers.Add("Authorization", "Bearer XXXXXXXXXXXXXX");
                webRequest.Headers.Add("Content-Type", "application/json");
                System.Net.WebResponse resp = webRequest.GetResponse();
                System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream());
                string result = sr.ReadToEnd().Trim();

但这也行不通。

【问题讨论】:

  • 我们需要整个堆栈跟踪 - 您只提供了第一位,这不足以看出问题所在。
  • 调用栈很好,但这里实际的异常(类型+消息)会更有用

标签: c# asp.net async-await botframework direct-line-botframework


【解决方案1】:

您不能将 Content-Type 设置为自定义标头,而是这样做:

webRequest.ContentType = "application/json";

另外,您需要在 POST 请求中包含 Content-Length:

string content = " ";
webRequest.ContentLength = content.Length;

之后需要写入数据:

  using (var streamWriter = new StreamWriter(webRequest.GetRequestStream()))
            {
                streamWriter.Write(content);
                streamWriter.Flush();
                streamWriter.Close();
            }

如果您的底层连接关闭,请确保初始化 ServicePointManager,它会阻止底层连接关闭:

 public Form1()
        {
             ServicePointManager.Expect100Continue = true;
             ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
             InitializeComponent();
        }

所以最后我们有一个看起来像这样的请求:

System.Net.WebRequest webRequest = System.Net.WebRequest.Create("https://directline.botframework.com/v3/directline/conversations");
        webRequest.Method = "POST";
        string content = " ";
        webRequest.Headers.Add("Authorization", "Bearer XXXXXXXXXXXXXX");
        webRequest.ContentType = "application/json";
        webRequest.ContentLength = content.Length;
        using (var streamWriter = new StreamWriter(webRequest.GetRequestStream()))
        {
            streamWriter.Write(content);
            streamWriter.Flush();
            streamWriter.Close();
        }
        System.Net.WebResponse resp = webRequest.GetResponse();
        System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream());
        string result = sr.ReadToEnd().Trim();
        sr.Close();
        resp.Close();

您只需要使用正确的授权标头,否则您将得到 ​​p>

(403) 禁止

来自服务器的响应。

【讨论】:

  • 是的,谢谢
【解决方案2】:

所以在添加两行代码后,它也开始使用框架 4.5

ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

【讨论】:

    猜你喜欢
    • 2017-12-23
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多