【问题标题】:How to pass all routes to a single controller in Web API?如何将所有路由传递给 Web API 中的单个控制器?
【发布时间】:2018-03-22 14:46:49
【问题描述】:

我有一个 OWIN 托管应用程序,它可以做 2 件事:

  1. mydomain.com/api/...提供API

  2. 将所有其他请求路由到返回 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/ 开头,否则我想返回一个 HTML 页面。

有没有使用 Web API 实现此目的的好方法?

=== 编辑

我也在使用静态文件 - 所以静态文件系统的路径应该被明确忽略:

HttpConfiguration config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
config.Routes.IgnoreRoute("StaticFiles", "Public/{*url}");
...

【问题讨论】:

    标签: c# asp.net-web-api asp.net-web-api-routing


    【解决方案1】:

    创建单独的路线。一个用于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);
        }
    }
    

    【讨论】:

    • 谢谢。我不知道已经有一个可用的 HttpResponseMessage 实例。但这对我不起作用 - 我收到 404 错误
    • 如果我改为使用通配符 {*url} 那么我不会得到 404,但索引控制器会捕获每个请求(包括 /api/...)
    • @ZachSmith 这是我的错字。固定的。 catch all 将捕获所有未通过先前路由映射到控制器的路由。此外,您注册路线的顺序也很重要。这就是为什么我按照我在答案中的顺序显示它
    • 这绝对行不通。您确定可以使用路线排序吗?我使用此配置发出的每个请求都会返回 index.html
    • 即对 /api/... 的请求没有被第一条路由捕获
    猜你喜欢
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 2015-01-06
    相关资源
    最近更新 更多