c# - HttpClient 抛出意外的 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(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at 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 设置为自定义标头,而是这样做:
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();
您只需要使用正确的 Authorization 标头,否则您将得到
(403) 禁止
来自服务器的响应。
推荐阅读
- java - JSON - 在所有数组元素中设置字段值
- npm - ATOM 包安装失败,以及更新
- git - Git 在 rm --cached 之后删除工作树中的一些文件并在分支之间移动
- c# - 使用 AMD 的 Twilio 定制出站呼叫
- matlab - 如何在 Matlab 中模拟电容器行为?
- python - 如何在 python 中使用 bunyan 为 sysout 日志使用日志记录适配器
- ssas - 用于 asp.net 核心的 ADOMD nuget 包
- java - Eclipse VerificationTokenRepository 类型的层次结构不一致
- jquery - jQuery 中未检测到简单表单 ID
- java - 如何在Java中计算目录中具有相同文件扩展名的文件数?