【问题标题】:ASP WebAPI can we have optional RoutePrefix?ASP WebAPI 我们可以有可选的 RoutePrefix 吗?
【发布时间】:2016-09-26 09:00:11
【问题描述】:

我想知道是否可以在 URL 中使用可选前缀设置 WebAPI RoutePrefix?我想要实现的是能够在我的 WebAPI 路由中可选地传递(或不传递)语言环境。我希望有 2 条可能的路线提供相同的结果。

URL 1(带区域设置) http://localhost/en-US/api/users/1

URL 2(无语言环境) http://localhost/api/users/1

//WebApiConfig.cs
config.Routes.MapHttpRoute(
            name: "ApiWithLanguage",
            routeTemplate: "{language}/api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional },
            constraints: new { language = @"^(([a-z]{2})|([a-z]{2}-[a-zA-Z]{2}))$" } // can be:: en, en-CA, fr, fr-CA, ...
);

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

我尝试在我的 WebAPI 控制器中添加以下代码:

// UserController.cs
[System.Web.Http.RoutePrefix("{language?}/api")]
public class UserController : ApiController

它适用于提供的语言环境,但没有它就无法工作......我认为? 会使它成为可选的,但它似乎没有任何效果。能做到吗,还是根本做不到?

【问题讨论】:

    标签: c# asp.net asp.net-web-api asp.net-web-api-routing


    【解决方案1】:

    它不起作用,因为您混合了属性路由和常规路由! 要使其正常工作,请使用常规路由并从控制器中删除 RoutePrefix 和任何其他 Route 属性。

    【讨论】:

    • 问题是,如果我这样做,我会得到带有控制器和操作http://localhost/api/User/GetUser/1 的老式路由,而我试图避免这种情况
    猜你喜欢
    • 1970-01-01
    • 2015-09-12
    • 2011-05-31
    • 2010-11-25
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    相关资源
    最近更新 更多