【问题标题】:Serving static content via Web API通过 Web API 提供静态内容
【发布时间】:2013-09-23 01:43:53
【问题描述】:

我目前正在使用在 OWIN/Katana 上运行的 WebAPI(在 Windows Azure 辅助角色实例上)。客户端(使用 HTML、CSS 和 Javascript 构建的主页)通过 REST 接口与 WebAPI 交互。

HTML、CSS、Javascript、图像等静态/客户端相关文件将保存在 Windows Azure Blob 存储中。

我现在想通过 WebAPI/OWIN 提供此静态内容。

第一个解决方案是从 blob 存储中加载文件,并将路由映射到控制器,该控制器将该文件的 blob 内容返回为 HttpResponse(参见 here

这仅适用于一个文件,但我的 index.html 包括其他 CSS 和 Javascript 文件。所以浏览器开始寻找@http://[OWIN-Web-Server-URL]/anotherJSfile.js,当然什么也没找到,因为没有为此定义路由。我不能/不想为每个文件定义一个路由,因为客户端应该从 Blob 存储中获取文件,而不需要绕过 Web 服务器(1-2 个索引/启动文件是可以接受的,但一切否则应通过 blob 存储提供服务)。

第二次尝试是使用一些提供“静态内容”功能的外部库,但它们都不起作用并且处于 alpha 状态(参见 herehere) .

第三个并且不太可接受的解决方案是从 http://[OWIN-Web-Server-URL]/ 重定向到 blob 存储上的 index.html 文件。这样可能会起作用,但 URL 总是类似于 https://xxx.blob.core.windows.net/jsscripts/index.html,这是不可取的,因为如果 blob 存储名称 (xxx) 发生更改,指向该站点的每个链接也会中断。

我的问题是:

目前是否有通过 Web API/OWIN 提供静态文件的解决方案?或者在即将发布的 Web API 2 版本中有什么解决方案?

【问题讨论】:

    标签: azure azure-storage asp.net-web-api


    【解决方案1】:

    解决方案,对我有用:

    根据我的第一个解决方案,我通过 Web API 控制器提供index.htmlbootstrapper.js 文件。

    index.html 文件将从 blob 存储加载,在服务器上格式化(获取存储帐户端点 url:https://xxx.blob.core.windows.net/)并通过HttpResponse(媒体类型:text/html)返回。 bootstrapper.js 将通过HttpResponse(媒体类型:应用程序/javascript)加载和返回。

    index.html 文件现在使用剩余静态内容的正确源 URL 调用 bootstrapper.js 文件。其余内容将从给定的源 URL 相对加载。

    在我们的生产系统中,源 URL 指向 Blob 存储,在开发环境中,URL 指向本地 Web 服务器。这是必需的,因为由 Web 服务器提供的 HTML 文件无法访问文件系统上的文件。因此需要一个提供这些文件的网络服务器(我们使用 WebStorm 中的内置网络服务器)。

    index.html文件:

    <!DOCTYPE HTML>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Main Page</title>
        <script type="text/javascript" src="bootstrap-app.js"></script>
        <script type="text/javascript">bootstrapApp('{0}');</script>
    </head>
    <body></body>
    </html>
    

    bootstrapper.js文件:

    /**
     * Loads all needed files asynchronously into the html file
     */
    window.bootstrapApp = function(baseUrl) {
        "use strict";
        var i, assetUrls;
    
        window.baseUrl = baseUrl;
    
        assetUrls = [   'https://cdnjs.cloudflare.com/ajax/libs/codemirror/2.36.0/codemirror.min.css',
            'https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js',
            'https://cdnjs.cloudflare.com/ajax/libs/jquery-mousewheel/3.0.6/jquery.mousewheel.min.js',
            'https://cdnjs.cloudflare.com/ajax/libs/codemirror/2.36.0/codemirror.min.js',
            baseUrl + '../lib/xxx.js',
            baseUrl + '../lib/xxx/xxx.js',
            baseUrl + 'resources/xxx.css',
            baseUrl + 'xxx.js'
        ];
    
        function endsWidth(string, suffix) {
            return (string.indexOf(suffix, string.length - suffix.length) !== -1);
        }
    
        // Load all assets from the previously defined array asynchronously in the order they are given in the array
        for (i = 0; i < assetUrls.length; i++) {
            // Load css or js asset
            if (endsWidth(assetUrls[i], 'css')) {
                document.write('<link rel="stylesheet" type="text/css" href="' + assetUrls[i] + '" />');
            } else if (endsWidth(assetUrls[i], 'js')) {
                document.write('<script type="text/javascript" src="' + assetUrls[i] + '"></script>');
            }
        }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多