我在我的WebForms应用程序中使用IHttpHandler,在执行时通过适当的本地化将.resx资源动态加载到javascript中。我在这里设置了一个演示项目供参考:https://www.dropbox.com/s/qoo9bm7qtzgvhbj/TestJs.zip
我已经从这里(略)修改了源代码:https://github.com/RickStrahl/Westwind.Globalization以使其正常工作。
这个概念很简单。当我最初点击一个页面时,例如Default.aspx,会为通过调用加载到文件中的ProcessRequest
个标记调用<script />
:
JavaScriptResourceHandler.RegisterJavaScriptGlobalResources (this, "GlobalResources", "App_GlobalResources\\Global");
JavaScriptResourceHandler.RegisterJavaScriptLocalResources (this, "LocalResources");
这两个调用会将这些标记添加到页面的<head />
部分:
<script src="/JavaScriptResourceHandler.axd?ResourceSet=App_GlobalResources\Global&LocaleId=en-US&VarName=GlobalResources&ResourceType=resx&ResourceMode=1" type="text/javascript"></script>
<script src="/JavaScriptResourceHandler.axd?ResourceSet=Default.aspx&LocaleId=en-US&VarName=LocalResources&ResourceType=resx&ResourceMode=0" type="text/javascript"></script>
带有查询参数的简单HttpHandler调用。这适用于第一页加载,但后续调用具有相同脚本的其他页面不会调用ProcessRequest
。如果我在浏览器中手动跟踪正确的httpHandler地址,则会加载一个有效的脚本,但它与为上一页加载的脚本相同,即使查询字符串不同。
我确信它一定是一些奇怪的缓存机制,但我不确定是什么。我的web.config很基本:
<system.webServer>
<handlers>
<add name="JavaScriptResourceHandler" verb="GET" path="JavascriptResourceHandler.axd"
type="Westwind.Globalization.JavaScriptResourceHandler,Westwind.Globalization" />
</handlers>
</system.webServer>
我还尝试将IsReusable
设置为false,但没有效果。是否有其他对HttpHandler有更多经验的人有一些想法?
答案 0 :(得分:1)
原来我是对的,只是忽略了在ProcessRequest中发生的缓存:
HttpCachePolicy cache = Response.Cache;
cache.VaryByParams["LocaleId"] = true;
cache.VaryByParams["ResoureType"] = true;
cache.VaryByParams["IncludeControls"] = true;
cache.VaryByParams["VarName"] = true;
cache.VaryByParams["ResourceMode"] = true;
对我而言,最重要的是ResourceSet
参数,因此只需添加cache.VaryByParams["ResourceSet"] = true;
即可。
答案 1 :(得分:0)
尝试Web配置
对于经典应用程序池
<system.web>
<httpHandlers>
<add verb="*" path="*" type="Namespace.MyHttpHandler"/>
</httpHandlers>
</system.web>
对于集成应用程序池
<system.webServer>
<handlers>
<add name="myHttpHandler" verb="*" path="*" type="Namespace.MyHttpHandler"/>
</handlers>
</system.webServer>
一旦确认HTTP处理程序ProcessRequest被调用,您就可以适当地设置path属性和verb属性,并检查处理程序是否被调用。