我正在为我的应用程序使用asp.net和MVC4,而且我正在使用捆绑css和js文件。
当我查看我的跟踪文件时,我发现我的所有捆绑包请求都在使用会话。即所有捆绑请求都通过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
我认为我的捆绑请求不需要会话访问权限。如何禁用捆绑请求的会话访问权限?
答案 0 :(得分:2)
如果我正确理解您的问题,您希望禁用静态资源的会话状态。为此你可以做两件事:
1)禁用SessionState
Controller
为此您需要导入System.Web.SessionState
命名空间,然后使用以下代码行装饰您的控制器:
[SessioState(SessionStateBehavior.Disabled)
public class HomeController: Controller
{
}
有关详细信息,请访问以下链接:
Controlling Session State Behavior
2)创建静态资源
IIS设置:
在inetpub目录中创建两个网站。
现在将它们指向相同的物理目录,即
C:\的Inetpub \ www.domain.com
将domain.com重定向到www.domain.com
将任何domain.com请求重定向到www.domain.com。
以便必须将任何domain.com请求重定向到www.domain.com 因为为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>
使用PreApplicationStartMethod
和Microsoft.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()
,这样它就会使用static.domain.com呈现静态资源网址,无论是图像,脚本,CSS还是包,或者我们想要引用无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 less domain for bundling and static resources
希望这会帮助您实现目标。