2013-05-08 50 views
3

在一個獨立的(selfhosted)應用程序中,我希望有一個httpserver可以在單個基本地址上提供簡單的網頁(沒有任何服務器動態/腳本,它只是返回內容請求文件)或提供RESTful Web服務:我是否用這個基於ASP.NET Web API的web服務器重新發明了輪子?

  • 當請求http://localhost:8070/{filePath},它應該返回的文件(HTML,JavaScript的,CSS,圖像)的內容,就像一個正常的簡單Web服務器
  • 背後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

看起來你正在嘗試重新創建自己的主機的asp.net FileHandler。雖然有更好的解決方案。使用Katana(OWIN主機)作爲Web API的託管層。 OWIN支持在同一個應用程序中託管多個OWIN框架。就你而言,你可以在同一個OWIN應用程序中託管Web API和文件處理程序。

Filip在這方面有一個很好的博客文章,讓你開始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(); 
} 
+0

還有一種方法可以將WCF REST服務集成到Katana/OWIN中嗎? – bitbonk 2013-05-08 23:57:20

+0

不是我所知道的。 – 2013-05-09 00:47:50

+1

@bitbonk:我最近發現這個:http://www.nuget.org/packages/Gate.Wcf/(未測試過) – Robar 2013-08-28 07:50:41

1

IMO沒有什麼錯,你在做什麼。我使用自主主機提供文件,HTML文檔以及常規API。在覈心,自主主機正在使用HTTP.SYS,就像IIS一樣。

由於拉古拉姆提到有有提供靜態文件的一些優化Owin主機,但WCF selfhost是完全能夠獲得體面PERF的投放文件。

+0

我的方法存在的問題是,您在'WebController.Get'中看到的所有代碼都是經過試驗和錯誤發現的。我假設可能有更多的文件處理程序發送正確的http頭文件和正確的編碼內容等方式,所有瀏覽器期望它?如何在交付文件時處理此問題? – bitbonk 2013-05-09 16:53:22

相關問題