C# 使用async/await时mscorelib.dll引发System.NullReferenceException

C# 使用async/await时mscorelib.dll引发System.NullReferenceException,c#,async-await,C#,Async Await,我正在尝试使用async/await编写API Post方法,在调试过程中遇到一个运行时错误: “System.NullReferenceException”类型的未处理异常 在mscorlib.dll对象引用中发生,未设置为的实例 反对 调试器总是在跨过“等待”行后失败。它甚至都没能到达挡块。调试器刚刚存在 这是我的密码: public async Task<JsonResult> DoPost(int ID) { try

我正在尝试使用async/await编写API Post方法,在调试过程中遇到一个运行时错误:

“System.NullReferenceException”类型的未处理异常 在mscorlib.dll对象引用中发生,未设置为的实例 反对

调试器总是在跨过“等待”行后失败。它甚至都没能到达挡块。调试器刚刚存在

这是我的密码:

public async Task<JsonResult> DoPost(int ID)
        {
            try
            {
                using (var client = new HttpClient())
                {
                    //POST/GET
                    client.BaseAddress = new Uri("https://myapidomain.com/api/endpoint");
                    client.DefaultRequestHeaders.Accept.Clear();
                    client.DefaultRequestHeaders.Add("x-api-key", "my key goes here");
                    client.DefaultRequestHeaders
                        .Accept
                        .Add(new MediaTypeWithQualityHeaderValue("application/json"));

                    StringContent payload = new StringContent("{\"id\":\"123\"}"); 
                    var response = await client.PostAsync(client.BaseAddress, payload); 

                    return new JsonResult { Data = false };
                }
            }
            catch(Exception e) {
                return new JsonResult { Data = false };
            }
        }
公共异步任务DoPost(int-ID)
{
尝试
{
使用(var client=new HttpClient())
{
//发布/获取
client.BaseAddress=新Uri(“https://myapidomain.com/api/endpoint");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Add(“x-api-key”,“我的密钥在这里”);
client.DefaultRequestHeaders
接受
.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
StringContent有效负载=新的StringContent(“{\'id\':\'123\'”);
var response=wait client.PostAsync(client.BaseAddress,payload);
返回新的JsonResult{Data=false};
}
}
捕获(例外e){
返回新的JsonResult{Data=false};
}
}

我认为您应该将第一个
return
修改为
returnnewjsonresult{Data=response}或其他东西。否则,您的代码可以重构为一行方法
returnnewjsonresult{Data=false}。返回的内容是无关的-我没有以任何方式使用结果。返回之前的方法错误。但在所有条件相同的情况下,即使返回的是{Data=response},它也会抛出相同的错误。在尝试给定的实际代码时,我无法重现
NullReferenceException
。您的目标是.NET的哪个版本?您是从框架中获取
HttpClient
,还是从nuget包中获取?如果是后者,哪个版本?在调试器之外运行应用程序时是否获得NRE?您正在使用哪个IDE和版本?您能在Microsoft Visual Studio Professional 2017版本15.3.2 | Microsoft.NET Framework版本4.6.01055 | ASP.NET和Web工具2017 15.0.30726.0 | ASP.NET Web框架和工具2017 5.2.50601.0中复制吗?我想您是在ASP.NET上运行的吧?由于您没有使用
.ConfigureAwait(false)
,因此将在同步上下文中发布呼叫的继续。如果请求由于某种原因已经结束,则同步上下文将引发NullReferenceException异常。我不知道在
DoPost
之前执行的是什么代码,但是在方法完成之前,您正在某个地方结束请求。也许您没有在控制器中使用异步操作?我认为您应该将第一个
return
修改为
returnnewjsonresult{Data=response}或其他东西。否则,您的代码可以重构为一行方法
returnnewjsonresult{Data=false}。返回的内容是无关的-我没有以任何方式使用结果。返回之前的方法错误。但在所有条件相同的情况下,即使返回的是{Data=response},它也会抛出相同的错误。在尝试给定的实际代码时,我无法重现
NullReferenceException
。您的目标是.NET的哪个版本?您是从框架中获取
HttpClient
,还是从nuget包中获取?如果是后者,哪个版本?在调试器之外运行应用程序时是否获得NRE?您正在使用哪个IDE和版本?您能在Microsoft Visual Studio Professional 2017版本15.3.2 | Microsoft.NET Framework版本4.6.01055 | ASP.NET和Web工具2017 15.0.30726.0 | ASP.NET Web框架和工具2017 5.2.50601.0中复制吗?我想您是在ASP.NET上运行的吧?由于您没有使用
.ConfigureAwait(false)
,因此将在同步上下文中发布呼叫的继续。如果请求由于某种原因已经结束,则同步上下文将引发NullReferenceException异常。我不知道在
DoPost
之前执行的是什么代码,但是在方法完成之前,您正在某个地方结束请求。也许您的控制器中没有使用异步操作?