在独立(自托管)应用程序中,我希望有一个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和网页,我还有什么其他选择?
答案 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”);