【问题标题】:ASP.NET WebApi how to route the controller to a different nameASP.NET WebApi 如何将控制器路由到不同的名称
【发布时间】:2014-03-24 16:36:03
【问题描述】:

有一件非常基本的事情要做 - 我需要公开一个帖子 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}”的配置应该放在默认路由器之前。仍然无法使用属性路由。

【问题讨论】:

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


    【解决方案1】:

    您的场景应该只使用属性路由,而不必将名称更改为PswdrecController。您确定您使用的是来自 System.Web.Http 命名空间的 Route 属性吗?

    【讨论】:

    • 是的,我正在使用那个,但它根本没有效果。我在想这可能与这篇文章有关吗? stackoverflow.com/questions/17318901/…
    • 我无法重现您的问题。你能分享一下你的路由配置是什么样的吗?
    • 更新了问题,让您看看是否有任何可疑之处。看起来像一个常规的 WebApi 配置文件。
    【解决方案2】:

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

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

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

    希望能帮到你!

    【讨论】:

    • 然后将[ActionName("pswdrec")] 放在您的意思是 Post 动词上?
    • 好吧,问题出在路由器的优先级上,所以“api/mobile/pswdrec/{id}”的配置应该放在默认路由器之前。仍然无法使用属性路由。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-21
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 2013-11-03
      • 1970-01-01
      相关资源
      最近更新 更多