【问题标题】:MVC: Serve file with http headerMVC:使用 http 标头服务文件
【发布时间】:2016-10-11 07:11:48
【问题描述】:

我正在尝试遵循this 指南并将文件存储在子文件夹中。

但是,OneSignal 指南要求为这些文件提供额外的 HTTP 标头 Service-Worker-Allowed: /。我如何在 Asp.Net MVC 中做到这一点?

【问题讨论】:

  • 显示实际提供文件的代码

标签: asp.net asp.net-mvc http-headers onesignal


【解决方案1】:

您可以在控制器的操作中使用:

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();
    }
}

【讨论】:

  • 这对我不起作用。尝试使用文件位于 Scripts/Custom/OneSignal 目录中的以下代码: 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)); }
  • 我刚刚尝试了您的代码: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”,我得到了该文件(并且响应标头存在)。你能准确地说出什么不起作用吗?
  • 是的,所以我所要做的就是定义内容类型并返回内容而不是文件以供下载。
  • 我遇到了同样的问题。我在注册服务人员时设置了范围。而且我已经添加并且可以看到标题正确地允许范围'/'。你如何定义内容类型?谢谢。
【解决方案2】:

无论我尝试什么,我都无法获得允许的范围,即使我可以在响应标头中看到它。我根据这篇文章想出了一个解决方案: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");
    }

【讨论】:

    猜你喜欢
    • 2017-10-15
    • 2012-01-20
    • 2016-08-20
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    相关资源
    最近更新 更多