Asp.net-Mvc

ASP.NET MVC 4 中的 Web Api 中的路由

  • April 5, 2013

我正在使用帶有 ASP.NET MVC 4 的 web api。

我有以下命名控制器

  • 客戶控制器:控制器
  • 客戶ApiController:ApiController

早些時候我CustomerApiController被命名CustomersController為訪問它,我只需輸入以下網址

> > 本地主機/api/客戶 > > >

但現在我必須將 api 控制器名稱保留為CustomerApiController. 我希望能夠使用localhost/api/Customers我必須進行的更改來使用相同的方法?

我嘗試在RouteConfig.cs文件中進行一些更改。我嘗試將以下內容添加到 RegisterRoutes 方法,但它們都不起作用。

routes.MapHttpRoute(
           name: "API Default",
           routeTemplate: "api/{controller}/{id}",
           defaults: new { id = RouteParameter.Optional }
       );

routes.MapRoute(
           name: "Customers",
           url: "api/customer/",
           defaults: new { controller = "CustomerApi", action = "Get", id = UrlParameter.Optional }
       );

請有人指導我。謝謝

好吧,您的程式碼中有兩個問題。您正在使用 MapRoute 而不是 MapHttpRoute。您還應該將更詳細的路線放在第一位,這樣它就不會被更通用的路線所吞噬:

routes.MapHttpRoute(
   name: "Customer",
   url: "api/Customer/{id}",
   defaults: new { controller = "CustomerApi", action = "Get", id = UrlParameter.Optional }
); 

routes.MapHttpRoute(
   name: "DefaultApi",
   routeTemplate: "api/{controller}/{id}",
   defaults: new { id = RouteParameter.Optional }
);

現在,如果您希望您的解決方案更通用(當您有更多需要像這樣修改的控制器時),您可以使用自定義HttpControllerRouteHandler來轉換傳入的控制器名稱,這樣您就可以保持預設路由。

首先,您需要創建自定義HttpControllerRouteHandler

public class CustomHttpControllerRouteHandler : HttpControllerRouteHandler
{
   protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
   {
       requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString() + "Api";

       return base.GetHttpHandler(requestContext);
   }
}

現在您可以像這樣註冊您的 HttpRoute:

routes.MapHttpRoute(
   name: "DefaultApi",
   routeTemplate: "api/{controller}/{id}",
   defaults: new { id = RouteParameter.Optional }
).RouteHandler = new CustomHttpControllerRouteHandler();

這樣,當您將Customer放入 URL 時,引擎會將其視為CustomerApi

引用自:https://stackoverflow.com/questions/12742803