我试图找出为什么Chrome(26.0.1410.64)和IE10似乎无法识别我在ASP.NET Web API控制器的响应中设置的cookie.情况如下:
我的页面上有一个下拉菜单登录表单,它对我的Web API方法进行ajax调用(通过HTTP POST),Web API方法返回一些JSON数据,并在响应中设置一个cookie(使用HTTP头) .它在Firefox和Safari(因此,WebKit)中完美运行,但在Chrome或IE中则无法运行.Chrome和IE似乎完全忽略了在回复中发回的Cookie.我已经验证了(使用Fiddler)在回复时发回了cookie,所以我知道它就在那里 - 我无法弄清楚为什么IE10和Chrome不会接收它.
有任何想法吗?它与Chrome和IE10如何处理ajax请求中的响应cookie有关吗?
cookies ajax google-chrome internet-explorer-10 asp.net-web-api
我的网站上有一些使用某些CSS和JS资源的页面 - 但它们是唯一使用该css或js文件的页面 - 因此我不想在每个页面中包含CSS和JS引用.不是修改每个View来引用它需要的CSS/JS,我想我可以在Controller中创建一个bundle并将它添加到已经注册的Bundles中,然后它将包含在bundle引用中,但是这不是似乎是可能的,或者我可能只是以错误的方式去做.
例如,在我的Controller for a registration页面中,我想我可以这样写:
Bundle styleBundle = new Bundle("~/bundles/registrationStyleBundle");
styleBundle.Include("~/Content/Themes/Default/registration.css");
BundleTable.Bundles.Add(styleBundle);
Run Code Online (Sandbox Code Playgroud)
然后在我的/Views/Shared/_Layout.cshtml中有这个:
@foreach(Bundle b in BundleTable.Bundles)
{
if (b is StyleBundle)
{
<link href="@BundleTable.Bundles.ResolveBundleUrl(b.Path)" rel="stylesheet" type="text/css" />
}
else if (b is ScriptBundle)
{
<script src="@BundleTable.Bundles.ResolveBundleUrl(b.Path)" type="text/javascript"></script>
}
}
Run Code Online (Sandbox Code Playgroud)
但是这不起作用 - 唯一被渲染到我的页面的包最终是我在RegisterBundles(AppApper/BundleConfig.cs中)指定的那些包
知道如何实现这种"动态"或"运行时"捆绑吗?
编辑:按照Jasen的建议,我最终做的是从控制器中取出捆绑创建/注册代码,并将其添加到/App_Start/BundleConfig.cs中的RegisterBundles().这样,捆绑包已经可用并且内容被缩小.所以:
bundles.Add(
new StyleBundle("~/bundles/registrationStyleBundle")
.Include("~/Content/Themes/default/registration.css"));
Run Code Online (Sandbox Code Playgroud)
然后,在我看来,我补充说:
@section viewStyles{
<link href="@BundleTable.Bundles.ResolveBundleUrl("~/bundles/registrationStyleBundle")." rel="stylesheet" type="text/css" />
}
Run Code Online (Sandbox Code Playgroud)
然后,在/Views/Shared/_Layout.cshtml中,我添加了这个:
@RenderSection("viewStyles", required: false)
Run Code Online (Sandbox Code Playgroud) 我搜索过该网站,并没有找到我正在寻找的确切内容.关闭,但没有雪茄.
基本上我想要一个像这样的配置部分:
<configSections>
<section name="PhoneNotificationsSection" type="Alerts.PhoneAlertConfigSection,Alerts,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null"/>
</configSections>
<PhoneNotificationsSection>
<phones>
<add phone="MyMobile" value="1234567890@vtext.com" />
<add phone="OtherMobile" value="1234567890@txt.att.com" />
</phones>
</PhoneNotificationsSection>
Run Code Online (Sandbox Code Playgroud)
然后我想在我的appSettings消费代码中,能够编写这样的东西(伪代码):
foreach (phone p in phones)
{
//'phone' attribute is just helpful/descriptive
DoSomething(p.value);
}
Run Code Online (Sandbox Code Playgroud)
我做了足够的研究,知道我可能需要一些自己的类来实现和/或继承某些Configuration类,以使上述代码成为可能.我只是没有发现任何清楚地演示这种情况以及如何编写代码的东西 - 当我尝试学习整个.NET配置世界时,我的大脑开始受到伤害.任何人都有一些像我正在寻找他们可以共享的代码吗?
configuration app-config config configuration-files appsettings
如果以前曾经问过我,我会道歉,但我还没有找到我头脑中的具体问题.
对于我正在构建的网站(使用ASP.NET MVC) - 性能是一个重要特性.此外,该站点有可能托管在应用程序池每20分钟回收一次的环境中(或者如果达到内存阈值则更快).我希望完全独立于依赖会话变量,而是在cookie中存储类似GUID的值.我的理由是 - 我不知道会话将持续多长时间,因为AppPool回收并且不希望他们的会话过早超时并导致他们必须重复登录.
cookie中的GUID值将充当表的查找键,其中我存储类似会话的信息(用户ID值等).所以如果我需要那些数据,我可以从数据库中检索它.我仍然会利用Session_OnEnd事件清除那个"最后活动"值超过20分钟(或者长会话配置为持续时间)的行的会话表.所以我想我仍然会使用会话状态,而不是会话变量.
不过,我的担忧是关于表现.因此,我很好奇是否有更好的方法可以避免使用会话变量,同时仍然能够知道用户是谁,并以"类似会话"的方式管理他们对网站的访问.我仍然是MVC的新手,但多年来在ASP.NET中有很多经验,所以我希望我的问题有道理!
编辑:我有点害怕想要使用SQL会话状态,因为我可能会在共享的SQL服务器托管环境中,并且如果有必要删除,我认为我没有能够创建/运行作业的登录过期的sql会话数据等.在AppPool回收方案中依赖于Session_OnEnd和cookie有任何真正的缺点吗?对于AppPool回收时当前的会话,Session_OnEnd是否可以执行?