Добавление пользовательских заголовков на страницы ответов ViewEngine в ServiceStack - PullRequest
1 голос
/ 11 июня 2019

Я использую ServiceStack с SharpPages для визуализации динамического содержимого.По «причинам» мне нужно установить заголовки CORS Access-Control-Allow-Origin и Access-Control-Allow-Credentials, поддерживающие несколько поддоменов.

Моя функция SharpPages включена с помощью:

var pagesFeature = new SharpPagesFeature()
        {
            ScriptMethods = { new UrlScriptMethods(), new DbScriptsAsync() },
        };
        pagesFeature.Args[ServiceStack.Script.ScriptConstants.DefaultDateFormat] = "MM/dd/yyyy hh:mm";
        pagesFeature.Args[ServiceStack.Script.ScriptConstants.DefaultDateTimeFormat] = "MM/dd/yyyy hh:mm";
        Plugins.Add(pagesFeature);

Я хостингв IIS, поэтому я мог бы использовать web.config, как показано ниже, но таким образом я могу указать только один домен.Если я укажу несколько вызовов XMLHttpRequest, то получу жалобу, что для этого заголовка задано несколько доменов.

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="https://subdomain.domain.com" />
    </customHeaders>
  </httpProtocol>
</system.webServer>

Аналогичным образом, я мог бы использовать свойство ServiceStack HostConfig GlobalResponseHeaders, но с той же сделкой.

Я даже пробовал ServiceStack PreRequestFilters, но они не вызываются, если не вызывается метод службы.Вот мой фильтр:

this.PreRequestFilters.Add((httpReq, httpResp) =>
        {
            var origin = httpReq.Headers.Get(HttpHeaders.Origin);
            if (!string.IsNullOrWhiteSpace(origin))
            {
                httpResp.AddHeader(HttpHeaders.AllowOrigin, origin);
                httpResp.AddHeader(HttpHeaders.AllowCredentials, "true");
            }
        });

Наконец, StaticFileHandler.ResponseFilter не будет работать, так как я использую движок представления, а не статические файлы.

Итак, как я могу добавить пользовательскийзаголовки ответа для просмотра страниц (в частности, SharpPages, возможно, страниц Razor) в ServiceStack?

Необработанный запрос приведен ниже.Интересно, что я запрашиваю https://computer.domain, но FireFox переводит это на localhost.В любом случае, запрос favicon.ico НЕ попадает в ловушку фильтра.Запрос ниже НЕ.

GET /forms/newsletter HTTP/1.1
Host: localhost:44308
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: ss-pid=wCR4INmjLXpBnbsBoe2n
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache

Необработанный ответ:

HTTP/2.0 200 OK
cache-control: private
content-type: text/html
content-encoding: gzip
vary: Accept-Encoding
server: Microsoft-IIS/10.0
x-aspnet-version: 4.0.30319
x-sourcefiles: =?UTF-8?B?QzpcVXNlcnNcamtsZW1tYWNrXFNvdXJjZVxSZXBvc1xPQlJDX0JNU1xCTVMuV2ViLkJvdHRsZURyb3BDZW50ZXJzXEJNUy5XZWIuQm90dGxlRHJvcENlbnRlcnNcZm9ybXNcbmV3c2xldHRlcg==?=
x-powered-by: ASP.NET
access-control-allow-origin: *
date: Tue, 11 Jun 2019 16:28:34 GMT
content-length: 862
X-Firefox-Spdy: h2

Ответы [ 2 ]

1 голос
/ 12 июня 2019

PreRequestFilters теперь должен запускаться для всех запросов Razor и Sharp Pages из последней версии 5.5.1 +, которые теперь доступны на MyGet .

0 голосов
/ 11 июня 2019

Тем временем я создал портманто. Для определенной подпапки я использую web.config, чтобы разрешить все удаленные источники. Для вызовов на основе служб я использую свернутую вручную версию CorsFeature (небольшое количество настраиваемой логики не будет работать).

<location path="views/subfolder">  <-- applies the ACAO header for specific view pages
    <system.webServer>
      <httpProtocol>
        <customHeaders>
          <add name="Access-Control-Allow-Origin" value="*" />
        </customHeaders>
      </httpProtocol>
    </system.webServer>
  </location> 
...