WebApi'在以角度调用后发现了与请求匹配的多个操作'错误

san*_*s26 5 .net c# asp.net-web-api asp.net-web-api-routing

我觉得我的路由,控制器和呼叫都是正确的,但仍然无法弄清楚为什么我会收到"多个动作"错误.控制器本身调用服务总线,但我不能让它为GetJob打破我的断点.有任何想法吗?

路线:

public class WebApiInitializer : IInitializableModule
    {
        public void Initialize(InitializationEngine context)
        {    
            RouteTable.Routes.MapHttpRoute(
                "webapimethodroutes",
                "api/msi/{controller}/{action}",
                defaults: new {}
                );
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的工作控制器:

public class SBJobController : ApiController, IJobsController
    {
        [HttpPost]
        public CreateJobResponse CreateJob(CreateJobRequest request)
        {
            return BusProxy.Call<CreateJobRequest, CreateJobResponse>(request);
        }

        [HttpPost]
        public GetJobResponse GetJob(GetJobRequest request)
        {
            return BusProxy.Call<GetJobRequest, GetJobResponse>(request);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的角度服务电话:

function getJobs(pRequest) {
            var request = pRequest || {
                'Ids': [],
                'JobNumbers': [],
                'PageNumber': 1,
                'PageSize': 20,
            };
            return $http.post('/api/msi/SBJob/GetJob', request).error(function (data, status, headers, config) {
                //logError(data);
            });
        }
Run Code Online (Sandbox Code Playgroud)

请求对象:

public class CreateJobRequest : RequestBase
    {
        public JobEntity Job { get; set; }
        public AddressEntity Address { set; get; }
    }

public class GetJobRequest: RequestBase, IPageable
    {
        public int PageNumber { set; get; }
        public int PageSize { set; get; }
        public List<Guid> Ids { set; get; }
        public List<string> JobNumbers { set; get; }
        public Guid ChildOfCustomer { set; get; }
        public Guid ChildOfContact { set; get; }
        public JobTypeEnum JobType { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

我得到的确切错误:

{
    "Message": "An error has occurred.",
    "ExceptionMessage": "Multiple actions were found that match the request: \r\nCreateJob on type MSI.ServiceBus.ServiceControllers.SBJobController\r\nGetJob on type MSI.ServiceBus.ServiceControllers.SBJobController",
    "ExceptionType": "System.InvalidOperationException",
    "StackTrace": "   at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)\r\n   at System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)\r\n   at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"
}
Run Code Online (Sandbox Code Playgroud)

Cla*_*edi 13

web api上的路由以这种方式工作

  • 要查找控制器,Web API会将"Controller"添加到{controller}变量的值中.

  • 要查找操作,Web API会查看HTTP方法,然后查找名称以该HTTP方法名称开头的操作.例如,对于GET请求,Web API会查找以"Get ..."开头的操作,例如"GetContact"或"GetAllContacts".此约定仅适用于GET,POST,PUT和DELETE方法.您可以使用控制器上的属性启用其他HTTP方法.我们稍后会看到一个例子.路径模板中的其他占位符变量(例如{id})将映射到操作参数.

  • 您可以通过使用HttpGet,HttpPut,HttpPost或HttpDelete属性修改操作方法,而不是使用HTTP方法的命名约定,而是显式指定操作的HTTP方法.

这就是匹配2个动作的原因,"默认情况下"不使用方法的名称来匹配动作.你可能有这样的东西让它工作

public class WebApiInitializer : IInitializableModule
{
    public void Initialize(InitializationEngine context)
    {    
        RouteTable.Routes.MapHttpRoute(
            "CreateJob",
            "api/msi/SBJob/CreateJob",
            defaults: new {Controller = "SBKob", Action = "CreateJob"}
            );

        RouteTable.Routes.MapHttpRoute(
            "GetJob",
            "api/msi/SBJob/GetJob",
            defaults: new {Controller = "SBKob", Action = "GetJob"}
            );              
    }
}
Run Code Online (Sandbox Code Playgroud)