Asp.net mvc 3 FormsAuthentication.SetAuthCookie在异步操作中引发NullReferenceException

Asp.net mvc 3 FormsAuthentication.SetAuthCookie在异步操作中引发NullReferenceException,asp.net-mvc-3,asp.net-mvc-4,asp.net-4.0,async-await,Asp.net Mvc 3,Asp.net Mvc 4,Asp.net 4.0,Async Await,我发现FormsAuthentication.SetAuthCookie正在抛出NullReferenceException-对象引用未设置为azure网站上异步操作中的对象实例 我发现: Response.Cookies.Add(FormsAuthentication.GetAuthCookie("user-1", true)); 但是我已经有了 <appSettings> <add key="aspnet:UseTaskFriendlySync

我发现
FormsAuthentication.SetAuthCookie
正在抛出NullReferenceException-对象引用未设置为azure网站上异步操作中的对象实例

我发现:

        Response.Cookies.Add(FormsAuthentication.GetAuthCookie("user-1", true));

但是我已经有了

 <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
有人知道我怎样才能让它工作吗?

更新:

堆栈跟踪:

[NullReferenceException: Object reference not set to an instance of an object.]
   System.Threading.Tasks.<>c__DisplayClass1c.<GetRethrowWithNoStackLossDelegate>b__1b(Task task) +91
   System.Threading.Tasks.TaskHelpersExtensions.ThrowIfFaulted(Task task) +15
   System.Web.Mvc.Async.TaskAsyncActionDescriptor.EndExecute(IAsyncResult asyncResult) +77
   System.Web.Mvc.Async.<>c__DisplayClass3f.<BeginInvokeAsynchronousActionMethod>b__3e(IAsyncResult asyncResult) +16
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +29
   System.Web.Mvc.Async.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() +59
   System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +240
   System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) +12
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +31
   System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +23
   System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +128
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +26
   System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +14
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +25
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +55
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +41
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +25
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +55
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +28
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
   System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__4(IAsyncResult asyncResult) +28
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +25
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +55
   System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +31
   System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7
   System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +23
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +59
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.CallHandlerExecutionStep.OnAsyncHandlerCompletion(IAsyncResult ar) +96

我不打算回答这个问题,但我想知道为什么
FormsAuthentication.SetAuthCookie
会引发异常,以及为什么它在Azure网站上的行为不同,目前Windows Azure网站不支持.NET 4.5。您需要将项目降级到.NET4.0,这也意味着您需要重写代码以不使用async


您可以尝试bin部署应用程序所需的.NET 4.5程序集

此问题不是Azure特有的-在调用FormsAuthentication.SetAuthCookie之前调用Wait语句时,FormsAuthentication.SetAuthCookie方法将在异步操作中引发空引用异常

最简单的解决方案是使用以下各项:

        Response.Cookies.Add(FormsAuthentication.GetAuthCookie("user-1", true));
另一种方法是自己指定票证创建:

        var ticket = new FormsAuthenticationTicket(
            2,
            "user-1",
            DateTime.Now,
            DateTime.Now.AddDays(2),
            true,
            String.Empty,
            "/");

        var encTicket = FormsAuthentication.Encrypt(ticket);

        Response.Cookies.Add(new HttpCookie(".AUTH", encTicket));

你也可以改变这种方式,这取决于你自己

public ActionResult Index()
{
    var t1 = Task.Run(() => HttpClient().GetAsync("http://www.google.com"));
    t1.Wait();
    FormsAuthentication.SetAuthCookie("test", true);
    return View();
}
这种方法对我有效,我从格伦默顿的第一个答案中得到了这个想法


谢谢。

异常的堆栈跟踪是什么?您确定网站当前支持未发布的ASP.NET 4.5吗?@svick已添加堆栈trace@StephenCleary更新了问题标签,它应该只使用ASP.NET 4和异步目标软件包。我很确定,ASP.NET 4.5只支持
UseTaskFriendlySynchronizationContext
,但我也不认为这是问题的原因。应用程序使用的是带有异步目标软件包的.NET 4,我认为Stephen Cleary的观点是,
UseTaskFriendlySynchronizationContext
仅在.NET 4.5中受支持,这是它在azure上失败而不是本地失败的原因。您能提供一些源代码来解释为什么会出现这种情况吗?我已经多次遇到这个问题,但一直无法找到支持文档。
public ActionResult Index()
{
    var t1 = Task.Run(() => HttpClient().GetAsync("http://www.google.com"));
    t1.Wait();
    FormsAuthentication.SetAuthCookie("test", true);
    return View();
}