将自定义标头添加到ServiceStack中的ViewEngine响应页面

时间:2019-06-11 14:37:42

标签: servicestack servicestack-razor

我正在将ServiceStackSharpPages结合使用来呈现动态内容。对于“原因”,我需要设置CORS标头Access-Control-Allow-OriginAccess-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不起作用,因为我使用的是视图引擎而不是静态文件。

那么,如何在ServiceStack中向视图页面(尤其是Sharpp页面,也可能是Razor页面)添加自定义响应标题?

原始请求如下。有趣的是,我请求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 个答案:

答案 0 :(得分:1)

现在应该为最新版本为Sharp Pages的最新v5.5.1 +的所有Razor和available on MyGet请求触发PreRequestFilters

答案 1 :(得分:0)

与此同时,我创建了一个波特曼酒。对于特定的子文件夹,我使用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>