我有一个ASP.NET Web API项目,我需要访问会话HttpContext.Current.Session
但它在web api中始终为null
符合Accessing Session Using ASP.NET Web API问题我需要Application_PostAuthorizeRequest事件。
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()
时一切正常。
任何帮助将不胜感激!
答案 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);
}