Я использую 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