ASP.NET捆绑请求的会话访问禁用

3

我正在使用asp.net和MVC4来开发我的应用程序,同时我也在使用bundling对css和js文件进行打包。

当我查看跟踪文件时,我发现所有的bundle请求都使用了session。也就是说,所有的bundle请求都经过了sessionstatemodule。

我的跟踪信息如下所示。

155. NOTIFY_MODULE_START ModuleName="Session", Notification="REQUEST_ACQUIRE_STATE", fIsPostNotification="false" 06:59:43.480 
156. AspNetPipelineEnter Data1="System.Web.SessionState.SessionStateModule" 06:59:43.480 
157. AspNetSessionDataBegin  06:59:43.480 
158. AspNetSessionDataEnd  06:59:43.996 
159. AspNetPipelineLeave Data1="System.Web.SessionState.SessionStateModule" 06:59:43.996 
160. NOTIFY_MODULE_COMPLETION ModuleName="Session", Notification="REQUEST_ACQUIRE_STATE", fIsPostNotificationEvent="false", CompletionBytes="0", ErrorCode="The operation completed successfully. (0x0)" 06:59:43.996 
161. NOTIFY_MODULE_END ModuleName="Session", Notification="REQUEST_ACQUIRE_STATE", fIsPostNotificationEvent="false", NotificationStatus="NOTIFICATION_CONTINUE" 06:59:43.996 

我认为对于我的捆绑请求,我不需要会话访问权限。如何禁用我的捆绑请求的会话访问权限?

1个回答

2
如果我理解您的问题正确,您想要为静态资源禁用会话状态。对此,您可以采取以下两种方法:
1)为控制器禁用SessionState 为此,您需要导入System.Web.SessionState命名空间,然后在您的控制器上添加以下代码行进行装饰:
[SessioState(SessionStateBehavior.Disabled)
public class HomeController: Controller
{
}

如需更多信息,请访问以下链接:

控制会话状态行为

2)创建静态资源

IIS设置:

在inetpub目录中创建两个网站。

  1. www.domain.com // 用于主站点
  2. static.domain.com // 用于静态资源

现在将它们指向相同的物理目录,即

C:\inetpub\www.domain.com

将domain.com重定向到www.domain.com

将任何domain.com请求重定向到www.domain.com。

因为cookie为domain.com设置的cookie也将被所有子域包括static.domain.com共享,因此这是非常重要的步骤。

**代码更改**

在web.config文件中添加以下代码:

<appSettings>

  <add key="StaticSiteName" value="static.domain.com"/>

  <add key="StaticDomain" value="http://static.domain.com"/>

  <add key="MainDomain" value="http://www.domain.com"/>

</appSettings>

使用PreApplicationStartMethodMicrosoft.Web.Infrastructure在预应用程序启动阶段动态注册HTTP模块。

public class PreApplicationStart

{

    public static void Start()

    {

        string strStaticSiteName = ConfigurationManager.AppSettings["StaticSiteName"];

        string strCurrentSiteName = HostingEnvironment.SiteName;



        if (strCurrentSiteName.ToLower() == strStaticSiteName.ToLower())

        {

            DynamicModuleUtility.RegisterModule(typeof(StaticResource));

        }

    }

}



public class StaticResource : IHttpModule

{

    public void Init(HttpApplication context)

    {

        context.BeginRequest += new EventHandler(context_BeginRequest);

    }



    void context_BeginRequest(object sender, EventArgs e)

    {

        HttpContext context = HttpContext.Current;

        string strUrl = context.Request.Url.OriginalString.ToLower();



        //HERE WE CAN CHECK IF REQUESTED URL IS FOR STATIC RESOURCE OR NOT

        if (strUrl.Contains("Path/To/Static-Bundle/Resource") == false)            

        {

            string strMainDomain = ConfigurationManager.AppSettings["MainDomain"];

            context.Response.Redirect(strMainDomain);

        }

    }



    public void Dispose()

    {

    }

添加扩展方法

介绍

public static class Extensions

{

    public static string StaticContent(this UrlHelper url, string contentPath)

    {

        string strStaticDomain = ConfigurationManager.AppSettings["StaticDomain"];

        return contentPath.Replace("~", strStaticDomain);

    }

}

现在,从视图中使用@Url.StaticContent(),以便它会呈现静态资源url,并将其与静态域名static.domain.com关联,无论是图片、脚本、CSS还是bundles或者其他我们想要引用的不需要cookie的域名。例如:
<link href="@Url.StaticContent("~/Content/Site.css")" rel="Stylesheet" />

<script src="@Url.StaticContent("~/Scripts/jquery-1.7.1.js")" type="text/javascript"></script>

<script src="@Url.StaticContent("~/bundles/jquery")" type="text/javascript"></script>



<img src="@Url.StaticContent("~/Images/heroAccent.png")" alt="" />

请访问下面的链接以获取完整信息,因为这篇文章相当长:

无cookie域捆绑和静态资源

希望这能帮助您实现目标。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接