2014-03-24 116 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?我沒有在你的代碼中看到它。如果這條線不在那裏,屬性路由將不起作用。

相關問題