3

在独立(自托管)应用程序中,我希望有一个 httpserver,它在单个基本地址上可以提供简单的网页(没有任何服务器端动态/脚本,它只返回内容请求文件)或提供 RESTful 网络服务:

  • http://localhost:8070/{filePath}被请求时,它应该返回文件的内容(html、javascript、css、图像),就像普通的简单网络服务器一样
  • 后面的一切都http://localhost:8070/api/应该充当普通的 RRESTful Web API

我当前的方法使用 ASP.NET Web API 来为 html 页面和 REST API 提供服务:

 var config = new HttpSelfHostConfiguration("http://localhost:8070/");
 config.Formatters.Add(new WebFormatter());
 config.Routes.MapHttpRoute(
   name: "Default Web",
   routeTemplate: "{fileName}",
   defaults: new { controller = "web", fileName = RouteParameter.Optional });
 config.Routes.MapHttpRoute(
   name: "Default API",
   routeTemplate: "api/{controller}/{id}",
   defaults: new { id = RouteParameter.Optional });

WebController是使用此幼稚代码为网页提供服务的控制器:

public class WebController : ApiController
{
    public HttpResponseMessage Get(string fileName = null)
    {
        /// ...
        var filePath = Path.Combine(wwwRoot, fileName);
        if (File.Exists(filePath))
        {
            if (HasCssExtension(filePath))
            {
                return this.Request.CreateResponse(
                   HttpStatusCode.OK, 
                   GetFileContent(filePath), 
                   "text/css");
            }

            if (HasJavaScriptExtension(filePath))
            {
                return this.Request.CreateResponse(
                   HttpStatusCode.OK,
                   GetFileContent(filePath),
                   "application/javascript");
            }

            return this.Request.CreateResponse(
              HttpStatusCode.OK, 
              GetFileContent(filePath), 
              "text/html");
        }

        return this.Request.CreateResponse(
            HttpStatusCode.NotFound,
            this.GetFileContnet(Path.Combine(wwwRoot, "404.html")),
            "text/html");
    }
}

再一次,对于后面的一切/api,使用普通 REST API 的控制器。

我现在的问题是:我在正确的轨道上吗?我觉得我在这里重建一个网络服务器,重新发明轮子。而且我想可能有很多 http 请求网络浏览器可能会使我在这里无法正确处理。

但是,如果我想在同一基址上自托管并同时服务器 REST Web API 和网页,我还有什么其他选择?

4

3 回答 3

3

看起来您正在尝试为自己的主机重新创建 asp.net FileHandler。不过有更好的解决方案。使用 Katana(一个 OWIN 主机)作为 Web API 的托管层。OWIN 支持在同一个应用程序中托管多个 OWIN 框架。在您的情况下,您可以在同一个 OWIN 应用程序中同时托管 Web API 和文件处理程序。

Filip 有一篇很好的博客文章可以帮助您从这里开始。您可以使用这样的配置代码,

public void Configuration(IAppBuilder appBuilder)
{
    // configure your web api.
    var config = new HttpConfiguration();
    config.Routes.MapHttpRoute("default-api", "api/{controller}");
    appBuilder.UseWebApi(config);

    // configure your static file handler.
    appBuilder.UseStaticFiles();
}
于 2013-05-08T18:53:42.747 回答
1

IMO 你在做什么没有错。我使用自托管来交付文件、html 文档以及作为常规 API。在核心,自托管使用 HTTP.SYS,就像 IIS 一样。

正如 RaghuRam 提到的,有些 Owin 主机对提供静态文件进行了一些优化,但是 WCF selfhost 非常有能力获得不错的文件服务性能。

于 2013-05-09T11:35:19.387 回答
0

请参阅此链接,该链接使用更直接的方法

将应用设置为单独的 Web API 项目和 ASP.NET 应用

RouteTable.Routes.IgnoreRoute(" .js"); RouteTable.Routes.IgnoreRoute(" .html");

于 2013-08-30T02:31:52.277 回答