2015-11-11 7 views
0

Я использую угловую директиву, чтобы вытащить html-файл с моего сервера IIS7 classic mode (классический из-за SSO). Чтобы удовлетворить CORS, мне нужно прочитать ORGIN из запроса и добавить заголовок в ответ файла html. Этот бит не имеет большого значения. Моя проблема связана с моим кодом, чтобы на самом деле сделать это для статического файла HTML.IIS7: манипулировать заголовками для html-файлов в классическом режиме

Итак, в классическом режиме мои обработчики/модуль определены в system.web, а не в system.webSever. Поэтому я не могу использовать флаг runAllManagedModulesForAllRequests = "true", который не является частью схемы для system.web.

В system.web у меня есть:

<httpHandlers> 
    <!--<add path="*.html" verb="GET,HEAD" type="System.Web.StaticFileHandler" />--> 
    <add path="*.html" verb="GET,HEAD" type="My.Namespace.CrossOriginHandler, My.DLL.Name" /> 
    <add path="*" verb="*" type="System.Web.HttpNotFoundHandler" /> 
</httpHandlers> 

<httpModules> 
    <add name="CrossOriginModule" type="My.Namespace.CrossOriginModule, My.Dll.name" /> 
    </httpModules> 

Это выполняет отлично на страницах MVC или WebAPI вызовов. Он не выполняется для моего статического файла HTML.

Я начинаю опасаться, что мне нужно будет написать собственный фильтр ISAPI. Есть ли другой способ подключить мой код? Конфигурация, которую я пропускаю или подключаю между ISAPI-фильтром и HttpModule?

ответ

1

Есть несколько вариантов, которые у вас есть, и определенно вам не нужно писать ISAPI для этого.

Один из вариантов, если вы можете установить его для всех вслепую, чтобы просто использовать раздел httpProtocol, чтобы добавить заголовок:

<system.webServer> 
    <httpProtocol> 
    <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
    </customHeaders> 
    </httpProtocol> 
</system.webServer> 

однако, гораздо лучшим вариантом является использование URL Rewrite установить заголовки и все еще имеют все возможности контролировать происхождение и переписывать их соответствующим образом. я написал быстро статью о том, как сделать это здесь: http://www.carlosag.net/articles/enable-cors-access-control-allow-origin.cshtml

На высоком уровне это означает, что добавление URL Rewrite правило входящего трафика, чтобы захватить заголовок Origin и установить его в переменной сервера. Затем вы можете использовать эту переменную сервера позже в исходящем правиле, чтобы установить ее в заголовке. При желании я использовал карту перезаписи для определения происхождения, которое вы хотели бы разрешить.

<outboundRules> 
     <rule name="Set-Access-Control-Allow-Origin for known origins"> 
      <match serverVariable="RESPONSE_Access-Control-Allow-Origin" pattern=".+" negate="true" /> 
      <conditions> 
       <add input="{AllowedOrigins:{CAPTURED_ORIGIN}}" pattern=".+" /> 
      </conditions> 
      <action type="Rewrite" value="{C:0}" /> 
     </rule> 
    </outboundRules> 

увидеть полное объяснение здесь: http://www.carlosag.net/articles/enable-cors-access-control-allow-origin.cshtml

+0

я использовал <добавить имя = значение "Access-Control-Allow-Origin" = "*" />, но после того, как код переехал в нашей среде SSO UAT Мне нужно было указать $ httpProvider.defaults.withCredentials = true; что исключает использование шаблона. Правило перезаписи выглядит как билет и, возможно, спасло меня от беспокойства, если оно будет выполняться даже для статического контента. У меня была нагрузка обручей, чтобы проскочить, и мне действительно нужно написать это в сообщении в блоге, поэтому я не забуду это в следующий раз. – codinglifestyle