如何修复路由配置以接受第二个参数?

时间:2016-06-09 08:34:09

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

我已修改我的Get()端点以获取另一个参数,但它不再起作用

public async Task<AjaxResponse> Get(long id, string appType)
{

}

这是我为新参数添加的路径配置(如果我不添加此参数,则请求返回404):

routes.MapHttpRoute(  
    name: "GetUser",
    routeTemplate: "api/{controller}/{userId}/{appType}"
    );

现在请求该端点,例如

/api/AccountApi/343434338361295/customer

最终生成Get()端点的默认框架:

public IEnumerable<string> Get()
{
    return new string[] { "value1", "value2" };
}

我的路由配置有什么问题,我该怎么做才能修复它?

作为参考,我的整个路线配置如下:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    //ASP.NET Web API Route Config
    routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
        );

    routes.MapHttpRoute(
        name: "CreateOrLogin",
        routeTemplate: "api/{controller}/CreateOrLogin/{appType}/{userId}"
        );

    routes.MapHttpRoute(
        name: "GetUser",
        routeTemplate: "api/{controller}/{userId}/{appType}"
        );

    routes.MapHttpRoute(
        name: "GetAdsForRetailer",
        routeTemplate: "api/{controller}/GetAdsForRetailer/{userId}/{page}/{pageSize}"
        );

    routes.MapHttpRoute(
        name: "GetLatestAds",
        routeTemplate: "api/{controller}/GetLatestAds/{userId}/{maxId}"//
        );

    routes.MapHttpRoute(
        name: "GetAd",
        routeTemplate: "api/{controller}/GetAd/{userId}/{id}"//
        );

    routes.MapHttpRoute(
        name: "RegisterUser",
        routeTemplate: "api/{controller}/RegisterUser/"//
        );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

2 个答案:

答案 0 :(得分:2)

我现在无法测试,但我认为您在路线中定义的名称必须与Get方法中的名称相匹配,即不是

routeTemplate: "api/{controller}/{userId}/{appType}"
你应该

routeTemplate: "api/{controller}/{id}/{appType}"

无论您给出的名称如何,路径都应该匹配,但是框架可能会尝试使用反射来确定要调用的方法,并且对于该参数,名称将是相关的。

答案 1 :(得分:0)

您的代码中有两个错误:

首先,您的第一个参数的名称不正确。请使用userId或更新您的路由配置,如@ paolo-tedesco所述。

除此之外,Actions中的参数类型应始终为可为空。您为long提供了userId。其余的代码是完美的。只需在操作中尝试使用long?

public async Task<AjaxResponse> Get(long? userId, string appType)
{

}