【问题标题】:Mutiple actions were found that match request web api找到多个与请求 web api 匹配的操作
【发布时间】:2015-04-21 07:59:56
【问题描述】:

当我尝试在api/objects 上发帖时收到此错误Multiple actions were found that match the request(在此处调用我的代码 sn-p 中的最后一个操作) 我正在使用 web api 1。虽然我有更多控制器和更多围绕 web api 的 Post 操作,但它们都有一些简单的输入,如字符串或 int 或简单和复杂数据的组合。这只是一个仅接收一个复杂对象参数的后操作,因此当然是唯一接收ObjectMainData 模型的操作。 这是我的ObjectsController

   [HttpGet] 
    public List<ObjectMainData> Get()
    {
        CompressResponse();
        return objectRepository.GetObjects(UserPK);
    }
    [HttpGet]


    public List<ObjectMainData> GetObject(string objectId)
    {
        CompressResponse();
        return objectRepository.GetObjects(UserPK, objectId);
    }
    [HttpPost] //Update
    [OnlineAuthorize]
    public ObjectCreatedResponse Post(string objectId,[FromBody]ObjectMainData objekt)
    {
      //  string objectId = objekt.Id;
        ObjectCreatedResponse objectIdAndCode = null;
        objectIdAndCode = objectRepository.Update(objekt);
        return objectIdAndCode;
    }

   //Insert  
    [HttpPost, ActionName("Post")] 
    public ObjectCreatedResponse Spremi(ObjectMainData objekt)
    {
        string objectId = objekt.Id;
        ObjectCreatedResponse objectIdAndCode=null;
        if (objectId == null)
        {
            objectIdAndCode= objectRepository.Insert(objekt,UserPK);
            return objectIdAndCode;

        }
        else
        { 
          objectIdAndCode=objectRepository.Update(objekt);
           return objectIdAndCode;

        }

这是我的 web api 路由配置的相关部分:

        config.Routes.MapHttpRoute(  
             name: "objects/",
             routeTemplate: "api/objects",
             defaults: new { controller = "Objects" }
           );
        config.Routes.MapHttpRoute(
              name: "objects/{objectId}",
              routeTemplate: "api/objects/{objectId}",
              defaults: new { controller = "Objects" },
              constraints: new { objectId = @"\d+-\d+" }
            );

        config.Routes.MapHttpRoute(
           name: "api/objects/{objectId}/Attributes",
           routeTemplate: "api/objects/{objectId}/Attributes",
           defaults: new { controller = "ObjectAttributes" });


        config.Routes.MapHttpRoute(
          name: "api/objects/{objectId}/Images/{imageId}/Description",
          routeTemplate: "api/objects/{objectId}/Images/{imageId}/Description",
          defaults: new { controller = "Images", action = "Description" });


        config.Routes.MapHttpRoute(
         name: "api/objects/{objectId}/images",
         routeTemplate: "api/objects/{objectId}/Images",
         defaults: new { controller = "Images" });

        config.Routes.MapHttpRoute(
          name: "Units types api action selected",
          routeTemplate: "api/units/types/{objectId}",
          defaults: new { controller = "UnitsMisc", action = "Types" });

        config.Routes.MapHttpRoute(
           name: "api/objects/{objectId}/units/{unitId}",
           routeTemplate: "api/objects/{objectId}/units/{unitId}",
           defaults: new { controller = "Units" });


        config.Routes.MapHttpRoute(
        name: "images  api",
        routeTemplate: "api/objects/{objectId}/Units",
        defaults: new { controller = "Units" });


        config.Routes.MapHttpRoute(
         name: "api/objects/{objectId}/Images/sort",
         routeTemplate: "api/objects/{objectId}/Images/sort",
         defaults: new { controller = "Sort", action = "Images" });

      //SLIKA jedna
      config.Routes.MapHttpRoute(
        name: "api/objects/{objectId}/Images/{imageId}",
        routeTemplate: "api/objects/{objectId}/Images/{imageId}",
        defaults: new { controller = "Images" });


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

【问题讨论】:

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


    【解决方案1】:

    那是因为你有两个 post action,而路由系统无法选择其中一个

    您可以执行以下操作之一来避免该问题:

    • 在 Web API 路由和调用中使用操作名称,就像使用 MVC 控制器和路由一样
    • 更改更新方法:使用PUT 代替POST。这是 REST 语义:PUT vs POST in REST

    进行任何这些更改后,它将开始工作。

    【讨论】:

    • 我真的认为它会有所帮助,但它没有
    • 新问题是什么?您认为这会有所帮助,但我知道,如果您以正确的方式进行操作,它确实会有所帮助;) 请用您尝试过的内容以及您现在遇到的问题更新您的问题。
    • 我只是将 [HttpPut] 属性放在更新方法上。插入(有问题的方法)仍然存在 [HttpPost]
    • 如果我删除更新方法,插入方法仍然无法正常工作并出现同样的错误。
    • 如果您将Spremi 重命名为Post 的事件?如果是这样,请查看路线。它们看起来太复杂了。在一个大项目中,我只有少数几个,看起来你有太多的案例。试着简化一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 2016-07-31
    • 2017-01-03
    相关资源
    最近更新 更多