【问题标题】:WEB API Routing with Multiple Get Actions具有多个获取操作的 WEB API 路由
【发布时间】:2013-09-27 05:42:44
【问题描述】:

我是 WEB API 的新手,正在尝试遵循站点设置的路由方法

在我的控制器中,我有所有基于标准动词的动作 Get ... Delete。

我还有其他一些基于 Get Verb 的操作。我们为每个控制器注册路由,下面是我的路由设置。 见下文。我的 Actions 方法具有如下属性。但是,当我输入例如http://server:49279/api/Licenses 我收到错误提示 MultipleActions 匹配请求 Actions Search,SearchByArtistId

当控制器被硬编码时,不确定如何处理

任何帮助都会很有价值,因为我无法在线找到解决方案

谢谢

[System.Web.Http.AcceptVerbs(new string[] { "Get" })]
[System.Web.Http.ActionName("PublishersByLicense")]
public HttpResponseMessage PublishersByLicense(Guid Id)
{
string vControllerName="Licenses";
config.Routes.MapHttpRoute
       (
           name: "PublishersByLicense" + vControllerName,
           routeTemplate: "api/" + vControllerName + "/" + "PublishersByLicense" + "/{aLicenseId}",
           defaults: new
           {
               controller = vControllerName,
               action = "PublishersByLicense"
           },
           constraints: new
           {
               httpMethod = new HttpMethodConstraint(HttpMethod.Get)
           }
        );


            config.Routes.MapHttpRoute
           (
               name: "Search" + vControllerName,
               routeTemplate: "api/" + vControllerName + "/" + "Search" + "/{aTrackIds}",
               defaults: new
               {
                   controller = vControllerName,
                   action = "Search"
               },
               constraints: new
               {
                   httpMethod = new HttpMethodConstraint(HttpMethod.Get)
               }
           );



            config.Routes.MapHttpRoute
            (
                name: "GetAll" + vControllerName,
                routeTemplate: "api/" + vControllerName,
                defaults: new
                {
                    controller = vControllerName
                },
                  constraints: new
                  {
                      httpMethod = new HttpMethodConstraint(HttpMethod.Get)
                  }
            );


            config.Routes.MapHttpRoute
           (
               name: "GetSingle" + vControllerName,
               routeTemplate: "api/" + vControllerName + "/{aLicenseId}",
               defaults: new
               {
                   controller = vControllerName
               },
               constraints: new
               {
                   httpMethod = new HttpMethodConstraint(HttpMethod.Get)
               }
           );

这是我的控制器代码

[System.Web.Http.AcceptVerbs(new string[] { "Get" })]
[System.Web.Http.ActionName("Search")]
public HttpResponseMessage Search([FromUri]Guid[] aTrackIds)
{
public HttpResponseMessage Get()
{

【问题讨论】:

    标签: asp.net-web-api


    【解决方案1】:

    http://server:49279/api/Licenses 的请求将与您定义的第三条路由匹配:

    config.Routes.MapHttpRoute
    (
        name: "GetAll" + vControllerName,
        routeTemplate: "api/" + vControllerName,
        defaults: new
        {
            controller = vControllerName
        },
        constraints: new
        {
            httpMethod = new HttpMethodConstraint(HttpMethod.Get)
        }
    );
    

    由于您没有在其中明确指定 action 路由值,因此 Web API 会尝试自行查找最合适的操作。

    我不知道您的控制器代码,但我认为 SearchSearchByArtistId 具有相同数量的可以从请求数据中填充的参数,从而使它们成为同样好的(或坏的)动作选择.这就是为什么 Web API 不能明确地选择一个正确的操作。

    【讨论】:

    • 嗨 Marius 谢谢你的回答。我在我的问题中为获取和搜索添加了控制器代码签名。我不知道什么路线设置可以解决我的问题。我确实从网上查看了一些教程和示例,但这些都没有帮助。您是否知道任何好的资源 - 特别是具有多个 Get Actions 的示例代码。同样在我们的设置中,控制器名称是硬编码的 - 不是 {controller}
    猜你喜欢
    • 2013-08-27
    • 2018-09-04
    • 1970-01-01
    • 2014-02-04
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    相关资源
    最近更新 更多