IHttpHandler ProcessRequest未被调用。

问题描述 投票:1回答:2

我在我的WebForms应用程序中使用IHttpHandler在执行时动态加载.resx资源到javascript中,并进行适当的本地化。我在这里设置了一个演示项目,供大家参考。https:/www.dropbox.comsqoo9bm7qtzgvhbjTestJs.zip

我从这里修改了源码(略)。https:/github.comRickStrahlWestwind.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&amp;LocaleId=en-US&amp;VarName=GlobalResources&amp;ResourceType=resx&amp;ResourceMode=1" type="text/javascript"></script>
<script src="/JavaScriptResourceHandler.axd?ResourceSet=Default.aspx&amp;LocaleId=en-US&amp;VarName=LocalResources&amp;ResourceType=resx&amp;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,但没有效果。有谁对HttpHandlers比较有经验,有什么想法吗?

asp.net httphandler ihttphandler
2个回答
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; 做的伎俩。


0
投票

试试网页配置

对于经典应用池

  <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被调用,你可以适当地设置路径属性和动词属性,并检查处理程序是否被调用。

© www.soinside.com 2019 - 2024. All rights reserved.