【问题标题】:How can I fix my route configuration to accept a second parameter?如何修复我的路由配置以接受第二个参数?
【发布时间】:2016-06-09 08:34:09
【问题描述】:

我已经修改了我的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 }
    );
}

【问题讨论】:

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


    【解决方案1】:

    我现在无法对此进行测试,但我认为您在路由中定义的名称必须与 Get 方法中的名称匹配,即,而不是

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

    你应该有

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

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

    【讨论】:

    • 啊!这是我永远不会发现的那些尝试在火车上快速重构的错误之一。谢谢:-)
    【解决方案2】:

    你的代码有两个错误:

    首先,您的第一个参数的名称不正确。要么使用userId,要么按照@paolo-tedesco 的说法更新您的路线配置。

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

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

    【讨论】:

      猜你喜欢
      • 2019-02-14
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      • 2021-10-30
      • 2018-10-23
      相关资源
      最近更新 更多