HttpClient 抛出意外的 ThrowForNonSuccess
HttpClient throws unexpected ThrowForNonSuccess
具有以下适用于目标框架的代码 .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();
但这也行不通。
您不能将 Content-Type 设置为自定义 header,请改为:
webRequest.ContentType = "application/json";
此外,您需要将 Content-Length 包含在 POST 请求中:
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();
你只需要使用正确的授权header否则你会得到
(403) forbidden
来自服务器的响应。
因此,在添加两行代码后,它也开始使用框架 4.5
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
具有以下适用于目标框架的代码 .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();
但这也行不通。
您不能将 Content-Type 设置为自定义 header,请改为:
webRequest.ContentType = "application/json";
此外,您需要将 Content-Length 包含在 POST 请求中:
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();
你只需要使用正确的授权header否则你会得到
(403) forbidden
来自服务器的响应。
因此,在添加两行代码后,它也开始使用框架 4.5
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;