【问题标题】:Multiple actions were found that match the request - WebApi找到与请求匹配的多个操作 - WebApi
【发布时间】:2023-04-08 18:41:01
【问题描述】:

我已将 WebApi 添加到现有 MVC 应用程序并使用 post 方法创建控制器。我在 webapiconfig 中配置了一条路由。当我使用 Fiddler 发布到控制器时,我收到“多个操作”错误。我的 ApiConfig 和 Controller 发布在下面。 Ninject 正在进行一些 Ioc 和 DI。我是否需要添加不同的路线定义,或者这与正在发布的数据有关?

webapiconfig.cs

 public static void Register(HttpConfiguration config)
    {

        var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
        jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

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

材料控制器。

using ????.Info.DAL;
using ????.Info.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using IdentitySample.Models;

namespace ????.Info.Controllers.Api
{
public class MaterialsController : BaseApiController
{
    public MaterialsController(I????Repository repo)
        :base(repo)
    {
    }
    [Route("api/materials/")]
    public IEnumerable<MaterialModel> Get()
    {

        IQueryable<MaterialEntities.Materials> query;

        query = TheRepository.GetAllMaterials();

        var results = query
            .ToList()
            .Select(s => TheModelFactory.Create(s));

        return results;

    }
     [Route("api/materials/{id:int}")]
    public HttpResponseMessage GetMaterial(int id)
    {

        try
        {
            var material = TheRepository.GetMaterial(id);
            if (material != null)
            {
                return Request.CreateResponse(HttpStatusCode.OK, TheModelFactory.Create(material));
            }
            else
            {
                return Request.CreateResponse(HttpStatusCode.NotFound);
            }

        }

        catch (Exception ex)
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
        }

    }

    [HttpPost]

    public HttpResponseMessage Post([FromBody] MaterialModel materialModel)
    {
        try
        {
            var entity = TheModelFactory.Parse(materialModel);

            if (entity == null) Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Could not read MaterialType/Organization from body");

            if (TheRepository.Insert(entity) && TheRepository.SaveAll())
            {
                return Request.CreateResponse(HttpStatusCode.Created, TheModelFactory.Create(entity));
            }
            else
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Could not save to the database.");
            }
        }
        catch (Exception ex)
        {

            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
        }
    }


    public MaterialEntities.Materials Parse(MaterialModel materialmodel)
     { 
         try 
         { 
             var material = new MaterialEntities.Materials()
                { 
                    Name = materialmodel.Name,
                    Description = materialmodel.Description, 
                    DateCreated = materialmodel.DateCreated,   

                };


             return material; 
         } 
         catch (Exception) 
         { 

             return null; 
         } 
     } 


}

}

【问题讨论】:

  • 1.控制器还有其他动作吗? 2. 为什么不用use AttributeRouting? 3.尝试在action上方添加[HttpPost]。
  • 还有其他动作。 2. 我还没有深入研究 AttributeRouting。 3. 我先试试。
  • 不走运。我添加了 HttpPost 并尝试了 AttributeRouting。这是整个控制器。
  • 我没有使用属性路由,但您不应该删除 WebApi 配置类中的路由定义吗?
  • 尝试用以下代码替换现有的 WebApiConfig 代码:configuration.MapHttpAttributeRoutes(); configuration.Routes.MapHttpRoute("API Default", "api/{controller}/{action}/{id}", new { id = RouteParameter.Optional });

标签: asp.net-web-api


【解决方案1】:

好的,感谢您对此提供的所有帮助。通过将 config.MapHttpAttributeRoutes(); 添加到 WebApiConfig 已解决此问题。我删除了默认路由定义,因为我将使用 AttributeRouting 并且它现在可以工作了。

更新:看起来可以在 WebApiConfig 中混合属性和约定路由,如 here 所讨论的,所以我的问题通过将 config.MapHttpAttributeRoutes(); 添加到 WebApiConfig 解决了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-26
    • 2016-10-18
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    相关资源
    最近更新 更多