C# 使用PostAsync方法的HttpClient错误
使用HttpClient向第三方API进行PostAsync调用时。我在执行client.PostAsync时正好看到此错误。你知道这是什么原因吗 代码:C# 使用PostAsync方法的HttpClient错误,c#,asp.net-mvc,webclient,C#,Asp.net Mvc,Webclient,使用HttpClient向第三方API进行PostAsync调用时。我在执行client.PostAsync时正好看到此错误。你知道这是什么原因吗 代码: 公共类JobController:AsyncController { 公共操作结果视图页() { 返回视图(“~/Views/Pages/Submit.cshtml”); } 私有常量字符串ServiceUrl=”https://api.3points.io/v1/applications/"; [HttpPost] 公共异步任务提交() {
公共类JobController:AsyncController
{
公共操作结果视图页()
{
返回视图(“~/Views/Pages/Submit.cshtml”);
}
私有常量字符串ServiceUrl=”https://api.3points.io/v1/applications/";
[HttpPost]
公共异步任务提交()
{
var client=新的HttpClient();
var formData=new MultipartFormDataContent();
var encoded=Convert.ToBase64String(Encoding.UTF8.GetBytes(“abc123”));
client.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“基本”,编码);
foreach(Request.Form.AllKeys中的var键)
Add(新的StringContent(Request.Form[key]),String.Format(“{0}\”,key));
foreach(Request.Files.AllKeys中的字符串键)
{
var file=Request.Files[key];
如果(file==null | | file.ContentLength我会改变
var response = client.PostAsync(ServiceUrl, formData).Result
到
然后监视错误。将以下两行添加到web.config文件中:
// First tag might exist already
<httpRuntime targetFramework="4.5" />
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
//第一个标记可能已经存在
:
启用新的等待友好型异步管道
在4.5中介绍。我们的许多同步原语在早期
ASP.NET版本有一些不好的行为,例如在公共服务器上使用锁
对象或违反API约定。事实上,ASP.NET 4
SynchronizationContext.Post的实现是一个阻塞
同步调用!新的异步管道力求
高效,同时遵守其API的预期合同。
新的管道还对数据执行少量的错误检查
代表开发人员,例如检测对
异步void方法
某些功能(如WebSocket)需要设置此开关。
重要的是,async/await的行为在ASP.NET中没有定义
除非已设置此开关。(请记住:设置也足够。)
<代码> PaseActhCy]()/Case>是异步方法,需要考虑等待(需要向方法添加异步提示),或者执行Toas. WaIT(),然后获取响应。之前也出现过同样的问题,但没有任何运气,这是正确的。如果没有wait关键字,PostAsync之后的其余代码将继续执行并返回JsonResult。如果PostAsync返回错误,它可能不会在捕获中被捕获。当我添加wait时,它会强制我将操作方法设置为异步并将类型返回到任务。所有这些更改就绪后,我在执行Wait client.PostAsync调用时看到null异常。相同的异常,还是不同的异常?谢谢。您是否在运行Fiddler时尝试过此操作,以查看数据是否离开系统并到达端点?这样您可以验证POST数据是否已按预期组装。不,它没有命中外部终结点。我没有看到请求发出。我尝试了此操作,但遇到了相同的问题。视图是否需要知道它是由异步控制器抛出的?我认为问题可能是同步上下文作为null传递给延续回调:最后,这个答案解决了我的问题他day@Lali很高兴这有帮助:)
var response = client.PostAsync(ServiceUrl, formData).Result
var response = await client.PostAsync(ServiceUrl, formData);
// First tag might exist already
<httpRuntime targetFramework="4.5" />
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />