我试图帮助一位同事调试过去6个月来一直没有问题的问题.在最近部署ASP.NET MVC 2应用程序之后,FileResult强制用户打开或保存PDF文件的响应在客户端计算机上存在的问题足够长,以便PDF阅读器打开它们.
早期版本的IE(特别是6)是受影响的唯一浏览器.Firefox和Chrome以及较新版本的IE(> 8)都表现得如预期.考虑到这一点,下一节将定义重新创建问题所需的操作.
href属性的普通超链接).在action方法中,标头设置为指示浏览器如何缓存响应.他们是:
response.AddHeader("Cache-Control", "public, must-revalidate, post-check=0, pre-check=0");
response.AddHeader("Pragma", "no-cache");
response.AddHeader("Expires", "0");
Run Code Online (Sandbox Code Playgroud)
对于那些不熟悉标题的人不熟悉:
一个.缓存控制:公共
表示任何缓存都可以缓存响应,即使它通常只是非缓存或只能在非共享缓存中缓存.
湾 缓存控制:必须重新验证
当高速缓存接收到的响应中存在must-revalidate指令时,该高速缓存必须在该条目变为陈旧后才能响应后续请求而不首先使用源服务器重新验证它
C.缓存控制:预检(IE5引入)
定义以秒为单位的间隔,在此之后必须检查实体的新鲜度.检查可能在用户显示资源后发生,但确保在下一次往返时缓存的副本将是最新的.
d.缓存控制:后检查(IE5引入)
定义以秒为单位的时间间隔,在此之后必须在向用户显示资源之前检查实体的新鲜度.
即 Pragma:no-cache(确保向后兼容HTTP/1.0)
当请求消息中存在no-cache指令时,应用程序应该将请求转发到源服务器,即使它具有所请求内容的缓存副本
F.过期
Expires entity-header字段给出了响应被视为过时的日期/时间.
我们从操作中返回文件
return File(file, "mime/type", fileName);
Run Code Online (Sandbox Code Playgroud)向用户显示"打开/保存"对话框
这里有六个其他应用程序使用相同的标题来强制Excel,CSV,PDF,Word和大量其他内容在用户,从来没有一个问题.
在返回a之前,在action方法中设置响应头FileResult.我已经让我的同事尝试创建一个继承的新类,FileResult然后重写该ExecuteResult方法,以便它修改标题,然后base.ExecuteResult()改为 - 没有状态.
我预感到"0"的"Expires"标题是罪魁祸首.根据这篇W3C文章,将其设置为"0"意味着"已经过期".我确实希望它过期,我只是不希望IE在处理它的应用程序有机会打开它之前将其从文件系统中删除.
一如既往,谢谢!
在进一步测试(使用Fiddler检查标头)时,我们发现我们认为设置的响应头不是浏览器解释的响应头.由于我自己并不熟悉代码,因此我没有意识到一个潜在的问题:标题在操作方法之外被踩到了.
尽管如此,我还是要打开这个问题.依然突出是这样的:有似乎是有出入Expires具有数值头 …
我开发了一个嵌入在ASP.NET网页中的XAML浏览器应用程序(XBAP).我在客户端计算机上更新最新版本的XBAP时遇到问题.在开发过程中,我不得不使用Mage.exe工具清除应用程序缓存,以便在我的本地计算机上运行时可以看到我的更改.除了Mage.exe -cc在命令行中执行外,我还发现rundll32 dfshim CleanOnlineAppCache它也能正常工作.
但是,我不想让客户在命令行中运行任何命令.我需要做些什么才能使XBAP在客户端计算机上自动更新?先前版本的XBAP将继续运行,而不是在客户端计算机上刷新更新的XBAP.
更新
我在这个问题上创造了一笔赏金,因为我有同样的问题.根据我在线阅读的内容,XBAP应该将缓存版本#与网络服务器上的版本#进行比较,如果不同则下载新版本.我已经验证我的版本号不同,但缓存的副本仍然是我启动XBAP时运行的副本.
如果我在asp.net页面之外启动XBAP,也会出现缓存副本,但如果我更改了url参数,我会得到新版本.
更新#2
我发现XBAP会在XP 32位计算机上自动更新,但不能在我的Windows 7 64位计算机上自动更新.
我目前正在研究一个ASP.NET MVC项目,并发现了一个看起来很奇怪的错误.
在ASP.NET MVC模板表单中总是得到一个AntiForgeryToken(因此让我相信这是一个最佳实践).然而,AntiForgeryTokens似乎不适用于缓存.
例如,当我打开一个包含AntiForgeryToken的表单的网站并且我复制浏览器窗口时,两个窗口都具有完全相同的AntiForgeryToken,从而在发布表单时导致异常.禁用缓存时不存在此问题(通过ActionFilter NoCache,请参阅禁用整个ASP.NET网站的浏览器缓存).
所以我想我的问题是:这应该是那样的吗?除了禁用缓存以解决问题之外还有其他方法吗?
特别是默认的ASP.NET MVC模板包含AntiForgeryTokens但不禁用缓存(因此对上述错误开放)的事实让我很奇怪.
提前致谢!
我在使用C#的ASP.NET MVC上使用Razor.
我打电话给外部网页处理信用卡,然后它返回给我.然后我显示收据.
我想阻止他们回到上一个屏幕.
我没有底层的cs页面,比如asp,因为这些是.cshtml文件,来抓住这个事件.
此收据页面是一个视图,因此我不能将JavaScript放在标题中,因为它会影响使用它的每个页面.
有人知道我在这种情况下如何阻止后退按钮?
就像问题所说的那样,我想知道是否可以关闭整个站点的所有控制器和操作的缓存.谢谢!
我有一个简单的局部视图,我在主视图中渲染:
@Html.Action("All", "Template")
Run Code Online (Sandbox Code Playgroud)
在我的控制器上我有这个:
[OutputCache(CacheProfile = "Templates")]
public ActionResult All()
{
return Content("This stinks.");
}
Run Code Online (Sandbox Code Playgroud)
在我的配置中:
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<clear/>
<add name="Templates" duration="3600" varyByParam="none"/>
</outputCacheProfiles>
</outputCacheSettings>
<outputCache enableOutputCache="false" enableFragmentCache="false" />
</caching>
Run Code Online (Sandbox Code Playgroud)
这将在运行时失败,但有异常:
执行处理程序'System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper的子请求时出错
内在异常:
持续时间必须是正数
现在显然它没有拿起我的web.config设置,因为如果我将其更改为:
[OutputCache(Duration = 3600)]
Run Code Online (Sandbox Code Playgroud)
它会工作,而且在我的web.config通知我关掉enableOutputCache和enableFragmentCache,但它不支持这些设置.
奇怪的是,在普通视图中这些设置工作正常,那么部分视图是什么打破了这个呢?我错过了什么吗?顾说这应该工作得很好...... 总之,它是否应该尊重web.config中的缓存设置,如果没有,为什么不呢?
假设我有一个名为/ getdata的接口的asp.net mvc 3应用程序,不同的用户通过我的PC客户端软件连接到服务器并使用此接口获取私有数据.不同的用户通过他们自己的良好加密的令牌来识别.
现在的问题是ClientA告诉我们他得到了另一个用户的数据.从ClientA的日志中我们发现他得到了ClientB(但他们彼此不认识,他们不能共享帐户).我查看了我的Web应用程序的代码,但没有找到任何机会混合他们的数据.
所以我想知道这会发生:
(1)ClientB 通过Web代理在http标头中使用他的令牌向http://mysite.com/getdata发起http请求.
(2)Web代理访问我的Web服务器,获取ClientB的数据.
(3)我的Web服务器批准请求并返回ClientB的数据,因为一切正确.
(4)ClientB获取他的数据并正确显示
(5)在ClientB获取数据后几乎同一时间,ClientA启动相同的请求,并在标头中添加ClientA的令牌.
(6)Web代理找到ClientA请求的URL与ClientB相同,结果仍在缓存中,然后返回ClientB的数据.然后ClientA获取另一个数据.
在我的Web应用程序界面中,在开始时我已经设置了所有响应no-cache,max-age = 0等等以防止客户端缓存.我的问题是:
图像中的scanario可以发生吗?
如果是,我如何阻止Web代理返回缓存数据?我无法修改PC客户端的程序,并且Web代理服务器不受我的控制.
如果不是,A获得B数据的可能原因是什么?
我有一个非常简单的ASP.Net MVC3应用程序,它在索引页面上执行一个操作,该索引页面从数据库中检索数据并显示项目列表.当我单击其中一个项目的ActionLink转到详细信息页面,然后单击后退按钮(或点击退格键)时,它会将我带回索引页面,但没有数据存在.在控制器的操作方法中设置断点向我显示断点未被命中.如果我点击F5,它会点击控制器和方法.
这不会发生在Chrome或最新版本的FireFox中,一切都按预期工作.这似乎是一个IE问题.
有任何想法吗?
谢谢!
我注意到,使用.NET MVC站点,您可以使用多个正斜杠命中URL,例如:
http://www.example.com//category
http://www.example.com//category//product
Run Code Online (Sandbox Code Playgroud)
URL加载正常,一切正常,但是,我被要求阻止这种情况发生.
我一直在尝试使用IIS URL重写来使其工作:
<rewrite>
<rules>
<rule name="Remove multiple slashes" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{UNENCODED_URL}" matchType="Pattern" pattern="^(.*)//(.*)$" />
</conditions>
<action type="Redirect" redirectType="Permanent" url="{C:1}/{C:2}" />
</rule>
</rules>
</rewrite>
Run Code Online (Sandbox Code Playgroud)
然而,结果似乎很有气质.有时产品URL会重定向,有时它不会和类别一样.这几乎就像应用程序正在缓存URL一样.
有没有人知道我是否可以禁用任何缓存,或者是否有其他方法来解决这个多次斜杠问题?
任何帮助深表感谢.
asp.net-mvc ×4
caching ×4
c# ×3
iis ×3
asp.net ×2
.net ×1
back-button ×1
http-headers ×1
razor ×1
rewrite ×1
security ×1
webproxy ×1
wpf ×1
xbap ×1