gpt4 book ai didi

asp.net-mvc-3 - FormsAuthentication.SetAuthCookie 在异步操作中抛出 NullReferenceException

转载 作者:行者123 更新时间:2023-12-02 09:22:15 33 4
gpt4 key购买 nike

我发现 FormsAuthentication.SetAuthCookie 抛出 NullReferenceException - 未将对象引用设置为天蓝色网站上的异步操作内的对象实例。

我发现了以下内容:

http://connect.microsoft.com/VisualStudio/feedback/details/743350/formsauthentication-setauthcookie-throws-nullreferenceexception-if-called-in-an-async-action-in-mvc4

但是我已经有了

 <appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />

设置并且我的代码在本地工作正常,我只在部署到azure时遇到问题。我正在使用 Azure 网站( https://www.windowsazure.com/en-us/home/scenarios/web-sites/ ),据我了解,这通常使用 web.config 吗?我还尝试通过 Azure 控制面板添加应用程序设置

enter image description here

并将 .ConfigureAwait(false); 添加到我等待的方法中,但没有运气。

下面的代码将抛出异常

public class TestController : Controller
{
public async Task<ActionResult> Index()
{
var httpResponse = await new HttpClient().GetAsync("http://www.google.com");
FormsAuthentication.SetAuthCookie("test", true);
return View();
}
}

有人知道我如何让它发挥作用吗?

更新:

堆栈跟踪:

[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

更新

我发现手动设置 Cookie 是可行的

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, "test", DateTime.Now, DateTime.Now.AddMinutes(30), true, null, FormsAuthentication.FormsCookiePath);
string encTicket = FormsAuthentication.Encrypt(ticket);
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));

我不会回答这个问题,因为我想知道为什么 FormsAuthentication.SetAuthCookie 抛出异常以及为什么它在 Azure 网站上的行为不同

最佳答案

此问题并非 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));

关于asp.net-mvc-3 - FormsAuthentication.SetAuthCookie 在异步操作中抛出 NullReferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11882762/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com