【发布时间】:2016-10-11 07:11:48
【问题描述】:
我正在尝试遵循this 指南并将文件存储在子文件夹中。
但是,OneSignal 指南要求为这些文件提供额外的 HTTP 标头 Service-Worker-Allowed: /。我如何在 Asp.Net MVC 中做到这一点?
【问题讨论】:
-
显示实际提供文件的代码
标签: asp.net asp.net-mvc http-headers onesignal
我正在尝试遵循this 指南并将文件存储在子文件夹中。
但是,OneSignal 指南要求为这些文件提供额外的 HTTP 标头 Service-Worker-Allowed: /。我如何在 Asp.Net MVC 中做到这一点?
【问题讨论】:
标签: asp.net asp.net-mvc http-headers onesignal
您可以在控制器的操作中使用:
this.Response.Headers.Add("Service-Worker-Allowed","/");
希望得到帮助:-)
编辑: 一个更好的方法是创建一个动作过滤器来自动添加这个标题:
public class WorkerAllowedAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Headers.Add("Service-Worker-Allowed", "/");
base.OnActionExecuted(filterContext);
}
}
你可以把它放在你的动作(或你的控制器)上:
public partial class HomeController
{
[WorkerAllowed]
public ActionResult Index()
{
return View();
}
}
【讨论】:
public ActionResult OneSignal(string id) { this.Response.Headers.Add("Service-Worker-Allowed", "/"); return File("~/Scripts/Custom/oneSignal/" + id, System.Net.Mime.MediaTypeNames.Application.Octet, Path.GetFileName("~/Scripts/Custom/oneSignal/" + id)); } 我放置了一个与“~Scripts/Custom/oneSignal/1234”相对应的文件,我将网址称为“.../OneSignal/1234”,我得到了该文件(并且响应标头存在)。你能准确地说出什么不起作用吗?
无论我尝试什么,我都无法获得允许的范围,即使我可以在响应标头中看到它。我根据这篇文章想出了一个解决方案:https://weblog.west-wind.com/posts/2015/Nov/13/Serving-URLs-with-File-Extensions-in-an-ASPNET-MVC-Application
基本上,我们让 service worker js 文件看起来“存在”在根目录中,以避免范围问题。你可以将你的 service worker js 文件放在你想要的任何目录中(可能是 /Scripts)。然后,在 web.config(或 IIS)中设置 IIS 重写规则,将包含服务工作者文件名的任何请求重新路由到操作(确保指定操作的确切路径)。然后该操作将文件作为类型 javascript/application 返回。
<system.webServer>
<rewrite>
<rules>
<rule name="Service worker fix">
<match url="pwa-sw.js"/>
<action type="Rewrite" url="/home/serviceworker"/>
</rule>
</rules>
</rewrite>
</system.webServer>
然后是控制器
[AllowAnonymous]
[Route("serviceworker")]
public ActionResult serviceworker()
{
return File("/Scripts/pwa-sw.js", "application/javascript");
}
【讨论】: