在路由的Web API中的ASP.NET MVC 4 [英] Routing in Web Api in ASP.NET MVC 4

查看:89
本文介绍了在路由的Web API中的ASP.NET MVC 4的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的Web API和ASP.NET MVC 4。

我有以下命名控制器


  • CustomerController:控制器

  • CustomerApiController:ApiController

此前我的 CustomerApiController 被命名为 CustomersController 所以要访问它,我根本就在下面的网址冲


  

    

本地主机/ API /客户


  

但现在我必须保持API控制器名称 CustomerApiController 。我希望能够用打同样的方法本地主机/ API /客户我有什么样的变化,使?

我试图让在 RouteConfig.cs 文件中的一些变化。我尝试添加下面的方法的RegisterRoutes,但他们没有工作。

  routes.MapHttpRoute(
            名称:API默认,
            routeTemplate:API / {}控制器/(编号),
            默认:新{ID = RouteParameter.Optional}
        );routes.MapRoute(
            名称:客户,
            网址:API /客户/
            默认:新{控制器=CustomerApi,行动=获取,ID = UrlParameter.Optional}
        );

请可有人指导我在此。谢谢


解决方案

那么有你的code两个问题。您正在使用图路线,而不是MapHttpRoute。你也应该首先把更详细的路线,这样就不会得到由吞噬比较通用的一种:

  routes.MapHttpRoute(
    名称:客户,
    网址:API /客户/(编号),
    默认:新{控制器=CustomerApi,行动=获取,ID = UrlParameter.Optional}
);routes.MapHttpRoute(
    名称:DefaultApi
    routeTemplate:API / {}控制器/(编号),
    默认:新{ID = RouteParameter.Optional}
);

现在,如果你想你的解决方案更加通用的(当你有多个控制器,它需要这样的修改),您可以使用自定义 HttpControllerRouteHandler 变换输入的控制器名称,这样你就可以保持默认的路由。

首先,你需要创建自定义 HttpControllerRouteHandler

 公共类CustomHttpControllerRouteHandler:HttpControllerRouteHandler
{
    保护覆盖的IHttpHandler GetHttpHandler(RequestContext的的RequestContext)
    {
        。requestContext.RouteData.Values​​ [控制器] = requestContext.RouteData.Values​​ [控制器]的ToString()+API;        返回base.GetHttpHandler(RequestContext的);
    }
}

现在您可以注册Htt​​pRoute是这样的:

  routes.MapHttpRoute(
    名称:DefaultApi
    routeTemplate:API / {}控制器/(编号),
    默认:新{ID = RouteParameter.Optional}
).RouteHandler =新CustomHttpControllerRouteHandler();

此方式,当你把的客户的网址进入该引擎将像对待的 CustomerApi

I am using web api with ASP.NET MVC 4.

I have the following named controller

  • CustomerController : Controller
  • CustomerApiController : ApiController

Earlier my CustomerApiController was named CustomersController so to access it, I simply had to punch in the following url

localhost/api/Customers

but now I have to keep the api controller name as CustomerApiController. I want to be able to hit the same method using localhost/api/Customers what changes do I have to make ?

I have tried making some changes in the RouteConfig.cs file. I tried adding the following to the RegisterRoutes method, but none of them worked.

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 }
        );

Please can some one guide me on this. Thanks

解决方案

Well there are two issues in your code. You are using MapRoute instead of MapHttpRoute. You should also put the more detailed route first so it will not get swallowed by more generic one:

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 }
);

Now if you want your solution to be more generic (when you have more controllers which need to be modified like this) you can use custom HttpControllerRouteHandler to transform incoming controllers names, this way you will be able to keep default routing.

First you need to create custom 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);
    }
}

Now you can register your HttpRoute like this:

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

This way when you put Customer into URL the engine will treat it like CustomerApi.

这篇关于在路由的Web API中的ASP.NET MVC 4的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆