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