如何将所有路由传递给 Web API 中的单个控制器?
How to pass all routes to a single controller in Web API?
我有一个 OWIN 托管的应用程序可以做两件事:
在 mydomain.com/api/...
处提供 API
将所有其他请求路由到 return 一个 HTML 页面
的单个控制器
我目前有这条路线:
config.Routes.MapHttpRoute(
name: "default",
routeTemplate: "{controller}",
defaults: new { controller = "Index" }
);
而这个控制器:
public class IndexController : ApiController
{
public HttpResponseMessage Get()
{
string html = File.ReadAllText(@"C:/www/.../index.html");
HttpResponseMessage response = new HttpResponseMessage
{
Content = new StringContent(html),
StatusCode = System.Net.HttpStatusCode.OK
};
response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
return response;
}
}
当我回到我的家乡路线时,这很好用:
mydomain.com => HTML
如何配置路由模板以便我始终转到同一个控制器?
mydomain.com/path1 => I want the same HTML
mydomain.com/path1/something => I want the same HTML
mydomain.com/path2 => I want the same HTML
mydomain.com/path3/somethingElse => I want the same HTML
etc
我想要的东西看起来很简单...我不在乎它是 GET,POST,随便什么。除非路由以 api/
开头,否则我想 return 单个 HTML 页面。
有没有通过网络实现此目的的好方法API?
=== 编辑
我也在使用静态文件 - 所以应该明确忽略静态文件系统的路径:
HttpConfiguration config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
config.Routes.IgnoreRoute("StaticFiles", "Public/{*url}");
...
创建单独的路线。一个用于 API
,一个用于所有其他路径
//mydomain.com/api/...
config.Routes.MapHttpRoute(
name: "api",
routeTemplate: "api/{controller}",
defaults: new { controller = "Service" }
);
//mydomain.com/path1 => I want the same HTML
//mydomain.com/path1/something => I want the same HTML
//mydomain.com/path2 => I want the same HTML
//mydomain.com/path3/somethingElse => I want the same HTML
config.Routes.MapHttpRoute(
name: "default-catch-all",
routeTemplate: "{*url}",
defaults: new { controller = "Index", action = "Handle" }
);
控制器可以根据需要处理请求。
public class IndexController : ApiController {
[HttpGet]
[HttpPost]
[HttpPut]
public IHttpActionResult Handle(string url) {
string html = File.ReadAllText(@"C:/www/.../index.html");
var response = Request.CreateResponse(System.Net.HttpStatusCode.OK, html, "text/html");
return ResponseMessage(response);
}
}
我有一个 OWIN 托管的应用程序可以做两件事:
在
mydomain.com/api/...
处提供 API
将所有其他请求路由到 return 一个 HTML 页面
的单个控制器
我目前有这条路线:
config.Routes.MapHttpRoute(
name: "default",
routeTemplate: "{controller}",
defaults: new { controller = "Index" }
);
而这个控制器:
public class IndexController : ApiController
{
public HttpResponseMessage Get()
{
string html = File.ReadAllText(@"C:/www/.../index.html");
HttpResponseMessage response = new HttpResponseMessage
{
Content = new StringContent(html),
StatusCode = System.Net.HttpStatusCode.OK
};
response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
return response;
}
}
当我回到我的家乡路线时,这很好用:
mydomain.com => HTML
如何配置路由模板以便我始终转到同一个控制器?
mydomain.com/path1 => I want the same HTML
mydomain.com/path1/something => I want the same HTML
mydomain.com/path2 => I want the same HTML
mydomain.com/path3/somethingElse => I want the same HTML
etc
我想要的东西看起来很简单...我不在乎它是 GET,POST,随便什么。除非路由以 api/
开头,否则我想 return 单个 HTML 页面。
有没有通过网络实现此目的的好方法API?
=== 编辑
我也在使用静态文件 - 所以应该明确忽略静态文件系统的路径:
HttpConfiguration config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
config.Routes.IgnoreRoute("StaticFiles", "Public/{*url}");
...
创建单独的路线。一个用于 API
,一个用于所有其他路径
//mydomain.com/api/...
config.Routes.MapHttpRoute(
name: "api",
routeTemplate: "api/{controller}",
defaults: new { controller = "Service" }
);
//mydomain.com/path1 => I want the same HTML
//mydomain.com/path1/something => I want the same HTML
//mydomain.com/path2 => I want the same HTML
//mydomain.com/path3/somethingElse => I want the same HTML
config.Routes.MapHttpRoute(
name: "default-catch-all",
routeTemplate: "{*url}",
defaults: new { controller = "Index", action = "Handle" }
);
控制器可以根据需要处理请求。
public class IndexController : ApiController {
[HttpGet]
[HttpPost]
[HttpPut]
public IHttpActionResult Handle(string url) {
string html = File.ReadAllText(@"C:/www/.../index.html");
var response = Request.CreateResponse(System.Net.HttpStatusCode.OK, html, "text/html");
return ResponseMessage(response);
}
}