ASP.NET WebApi如何将控制器路由到其他名称

时间:2014-03-24 16:36:03

标签: asp.net asp.net-mvc asp.net-web-api

有一个非常基本的事情要做 - 我需要公开一个post API,例如mobile / api / pswdrec,我想绑定到我的PasswordController以避免这个枯燥的名字。

这是一个包含区域的webapi,我尝试了属性路由和MapHttpRoute。到目前为止都没有。

public class PasswordController : MobileApiControllerBase
{
    //[Route("api/mobile/pswdrec/")]
    public RestResponseMessage Post(UserCredentialsModel credentials)
    {
        return RestResponseMessage.OK();
    }
}

检查客户端,请求是正确的json请求。当我只是将控制器的名称更改为PswdrecController时,它就开始工作了。

还有其他方法可以重命名"控制器?

多年来一直致力于MVC,但现在却陷入了一个非常简单的问题:)感谢您的帮助;)

编辑:

public class MobileApiAreaRegistration : AreaRegistration 
{
    private static IWindsorContainer _container = new WindsorContainer();

    public override string AreaName
    {
        get 
        {
            return "MobileApi";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.Routes.MapHttpRoute(
            name: "MobileApiDefault",
            routeTemplate: "api/mobile/{controller}/{id}",
            defaults: new { controller = "Expenses", id = RouteParameter.Optional }
        );
    }

    public static void SetupWebApi(HttpConfiguration configuration)
    {/* just javascript serizlizer setup */}
}


public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        MobileApiAreaRegistration.SetupWebApi(config);
    }

    public static void SetupWindsorContainer(IWindsorContainer container)
    {
        MobileApiAreaRegistration.SetupWindsorContainer(container);
        WebApiAreaRegistration.SetupWindsorContainer(container);
    }
}


public class WebApiApplication : HttpApplication
{
    private static readonly IWindsorContainer _container = new WindsorContainer();

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        InitializeWindsorContainer();
        //InitializeExceptionFilters();
    }
}

没有什么特别的,但我无法使其发挥作用。当我使用控制器的原始名称时,它就像一个明星一样闪闪发光:)

解决方案:嗯,问题在于路由器的优先级,所以使用" api / mobile / pswdrec / {id}"应该在默认路由器之前放置。仍然无法使用属性路由。

3 个答案:

答案 0 :(得分:1)

您的方案应该只使用属性路由,而不必将名称更改为PswdrecController。您确定要使用System.Web.Http命名空间中的Route属性吗?

答案 1 :(得分:1)

配置路由器打开文件App_Start / WebApiConfig.cs并将此代码放在下面:

           config.Routes.MapHttpRoute(
                name: "MyCustomRouteApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { controller = "mobile", action = "pswdrec", id = RouteParameter.Optional}                
            );

编辑默认行:根据您的情况。这只是一个例子。

希望能帮到你!

答案 2 :(得分:1)

对于属性路由,您的routes.MapMvcAttributeRoutes();中是否有RegisterRoutes?我在你的代码中没有看到它。如果没有此行,属性路由将不起作用。