将自定义 headers 添加到 ServiceStack 中的 ViewEngine 响应页面
Add custom headers to ViewEngine response pages in ServiceStack
我正在使用 ServiceStack with SharpPages 呈现动态内容。对于 "reasons",我需要设置 CORS headers 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
调用会抱怨为 header.
设置了多个域
<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
不起作用,因为我使用的是视图引擎而不是静态文件。
那么,如何将自定义响应 header 添加到 ServiceStack
中的查看页面(尤其是 SharpPages,也可能是 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
与此同时,我创建了一个合成词。对于特定的 sub-folder,我使用 web.config 来允许所有远程来源。对于 Service-based 调用,我使用 CorsFeature
的 hand-rolled 版本(少量自定义逻辑将不起作用)。
<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>
现在应该为所有 Razor 和 Sharp Pages requests from the latest v5.5.1+ that's now available on MyGet 触发 PreRequestFilters
。
我正在使用 ServiceStack with SharpPages 呈现动态内容。对于 "reasons",我需要设置 CORS headers 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
调用会抱怨为 header.
<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
不起作用,因为我使用的是视图引擎而不是静态文件。
那么,如何将自定义响应 header 添加到 ServiceStack
中的查看页面(尤其是 SharpPages,也可能是 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
与此同时,我创建了一个合成词。对于特定的 sub-folder,我使用 web.config 来允许所有远程来源。对于 Service-based 调用,我使用 CorsFeature
的 hand-rolled 版本(少量自定义逻辑将不起作用)。
<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>
现在应该为所有 Razor 和 Sharp Pages requests from the latest v5.5.1+ that's now available on MyGet 触发 PreRequestFilters
。