我是否通过基于ASP.NET Web API的Web服务器重新发明了轮子?

时间:2013-05-08 17:44:01

标签: web-services asp.net-web-api webserver

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

  • 当请求http://localhost:8070/{filePath}时,它应该返回文件的内容(html,javascript,css,images),就像普通的简单网络服务器
  • 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请求Web浏览器可能会使我在这里无法正确处理。

但是,如果我想自己托管并同时通过相同的基地服务器REST Web API和网页,我还有什么其他选择?

3 个答案:

答案 0 :(得分:3)

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

菲利普有一篇很好的博客文章可以帮助你入门here。您可以使用这样的配置代码,

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

答案 1 :(得分:1)

IMO你正在做的事情没有错。我使用自托管来提供文件,HTML文档以及常规API。在核心,自主机正在使用HTTP.SYS,就像IIS一样。

正如RaghuRam所提到的,Owin主机对服务静态文件有一些优化,但是WCF selfhost能够为服务文件提供良好的性能。

答案 2 :(得分:0)

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

Setting app a separate Web API project and ASP.NET app

RouteTable.Routes.IgnoreRoute( “的.js”); RouteTable.Routes.IgnoreRoute( “的.html”);