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)