IHttpHandler ProcessRequest не вызывается

Я использую IHttpHandler в своем приложении WebForms для динамической загрузки ресурсов .resx в javascript во время выполнения с соответствующей локализацией. Я установил здесь демонстрационный проект для справки: https://www.dropbox.com/s/qoo9bm7qtzgvhbj/TestJs.zip

Я изменил источник отсюда (немного): https://github.com/RickStrahl/Westwind.Globalization, чтобы заставить его работать.

Концепция достаточно проста. Когда я впервые попадаю на страницу, например Default.aspx, для обоих тегов <script />, загружаемых в файл, вызывается ProcessRequest, вызывая:

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?


person itslittlejohn    schedule 04.08.2014    source источник


Ответы (2)


Оказалось, что я был прав и просто упустил из виду кеширование, происходящее внутри 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; помогло.

person itslittlejohn    schedule 04.08.2014

Попробуйте веб-конфигурацию

Для классического пула приложений

  <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 вызывается, вы можете соответствующим образом установить атрибут пути и атрибут verb и проверить, вызывается ли обработчик.

person Varun Nair    schedule 06.05.2020