6

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

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

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

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

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

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

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

我的问题是:

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

4

1 回答 1

3

解决方案,对我有用:

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

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

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

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

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>');
        }
    }
};
于 2013-09-23T11:53:29.360 回答