2014-03-24 207 views
0

有一个非常基本的事情要做 - 我需要公开一个post API,例如mobile/api/pswdrec,我想绑定到我的PasswordController以避免那个沉闷的名字。ASP.NET WebApi如何将控制器路由到不同的名称

这是一个带有区域的webapi,我正在尝试Attribute Routing和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 /移动/ pswdrec/{ID的配置}“应该放在默认路由器之前。仍然无法使用属性路由工作。

回答

1

您的场景应该只使用属性路由而不必将名称更改为PswdrecController。你确定你使用0​​命名空间的Route属性吗?

+0

是的,我使用那个,但它根本没有效果。我在想这可能与这篇文章有关吗? http://stackoverflow.com/questions/17318901/mvc-4-5-web-api-routing-not-working/17321724#17321724 –

+0

我无法重现你的问题在我的结束。你能分享你的路线配置是怎样的吗? –

+0

更新了问题,以便查看是否有任何可疑内容。看起来像一个普通的WebApi配置的东西。 –

1

配置路由器打开文件App_Start/WebApiConfig.cs,并把下面这段代码:

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

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

希望能帮到你!

+0

然后把'[ActionName(“pswdrec”)]'放在Post动词上你的意思是? –

+0

嗯,问题在于路由器的优先级,所以配置“api/mobile/pswdrec/{id}”应该放在默认路由器之前。仍然无法使用属性路由工作。 –

1

对于属性路由,你有routes.MapMvcAttributeRoutes();在你的RegisterRoutes?我没有在你的代码中看到它。如果这条线不在那里,属性路由将不起作用。

相关问题