使用SignalR时,MVC Application_PostAuthorizeRequest事件未触发

时间:2016-03-08 16:49:28

标签: asp.net asp.net-mvc asp.net-web-api asp.net-mvc-5 signalr

我有一个ASP.NET Web API项目,我需要访问会话HttpContext.Current.Session但它在web api中始终为null

符合Accessing Session Using ASP.NET Web API问题我需要Application_PostAuthorizeRequest事件。

的Global.asax.cs

public class MvcApplication : System.Web.HttpApplication
    {
        ...

        protected void Application_PostAuthorizeRequest()
        {
            if (IsWebApiRequest())
            {
                HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
            }
        }

        private bool IsWebApiRequest()
        {
            return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith(WebApiConfig.UrlPrefixRelative);
        }

}

但问题是 Application_PostAuthorizeRequest 事件永远不会触发。 我最近将我的项目从MVC4升级到了MVC5。

我只能捕获 Application_AuthenticateRequest ,但是当我在此事件中复制相同的代码时,它不会提供帮助且会话仍然为空

更新

我使用SignalR发送即时通知。 我发现当我评论这一行时app.MapSignalR() eveything正如我预期的那样工作,我可以抓住这个事件。

Startup.cs

[assembly: OwinStartup(typeof(Startup))]
namespace UI
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            HttpConfiguration config = new HttpConfiguration();

            ConfigureOAuth(app);

            WebApiConfig.Register(config);
            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
            app.UseWebApi(config);
            //app.MapSignalR(); when i comment this line I can catch the event
        }

        public void ConfigureOAuth(IAppBuilder app)
        {
            OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
            {
                AllowInsecureHttp = true,
                TokenEndpointPath = new PathString("/token"),
                // TODO expired time hardcoded
                AccessTokenExpireTimeSpan = TimeSpan.FromHours(24),
                Provider = new SimpleAuthorizationServerProvider(),
                RefreshTokenProvider = new SimpleRefreshTokenProvider()
            };

            // Token Generation
            app.UseOAuthAuthorizationServer(OAuthServerOptions);
            app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

        }
    }
}

有人能解释一下是什么错吗?为什么当我评论app.MapSignalR()时一切正常。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

OK!最后,我找到了自己的问题的解决方案。我不知道到底发生了什么,但是当我在Owin和WebApi之前注册SignalR时它工作正常,所以我将app.MapSignalR();移到了顶部。

这是Configuration的最终Startup.cs方法代码:

public void Configuration(IAppBuilder app)
{
    var currentCultureName = CultureInfo.CurrentCulture.Name;
    System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-us");
    app.MapSignalR();
    System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo(currentCultureName);

    HttpConfiguration config = new HttpConfiguration();
    ConfigureOAuth(app);

    WebApiConfig.Register(config);
    app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
    app.UseWebApi(config);
}