Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebApi';发现多个操作与请求匹配';调用后出错_C#_.net_Asp.net Web Api_Asp.net Web Api Routing - Fatal编程技术网

C# WebApi';发现多个操作与请求匹配';调用后出错

C# WebApi';发现多个操作与请求匹配';调用后出错,c#,.net,asp.net-web-api,asp.net-web-api-routing,C#,.net,Asp.net Web Api,Asp.net Web Api Routing,我觉得我的路线、控制器和呼叫都是正确的,但仍然无法理解为什么会出现“多动作”错误。控制器本身调用服务总线,但我无法让它达到GetJob的断点。有什么想法吗 路线: public class WebApiInitializer : IInitializableModule { public void Initialize(InitializationEngine context) { RouteTable.Routes.Map

我觉得我的路线、控制器和呼叫都是正确的,但仍然无法理解为什么会出现“多动作”错误。控制器本身调用服务总线,但我无法让它达到GetJob的断点。有什么想法吗

路线:

public class WebApiInitializer : IInitializableModule
    {
        public void Initialize(InitializationEngine context)
        {    
            RouteTable.Routes.MapHttpRoute(
                "webapimethodroutes",
                "api/msi/{controller}/{action}",
                defaults: new {}
                );
        }
    }
我的作业管理员:

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);
        }
    }
请求对象为:

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; }
    }
公共类CreateJobRequest:RequestBase
{
public JobEntity作业{get;set;}
公共地址实体地址{set;get;}
}
公共类GetJobRequest:RequestBase,IPageable
{
公共整数页码{set;get;}
公共int PageSize{set;get;}
公共列表ID{set;get;}
公共列表作业编号{set;get;}
客户的公共Guid子级{set;get;}
公共Guid ChildOfContact{set;get;}
public JobTypeEnum JobType{get;set;}
}
我得到的确切错误是:

{
    "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()"
}
{
“消息”:“发生错误。”,
“ExceptionMessage”:“找到多个与请求匹配的操作:\r\n MSI.ServiceBus.ServiceControllers.SBJobController类型上的创建作业\r\n MSI.ServiceBus.ServiceControllers.SBJobController类型上的创建作业”,
“异常类型”:“System.InvalidOperationException”,
“StackTrace”:“在System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelector或CacheItem.SelectAction(HttpControllerContext controllerContext)\r\n在System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext controllerContext)上(HttpControllerContext controllerContext,CancellationToken CancellationToken)\r\n位于System.Web.Http.Dispatcher.HttpControllerDispatcher.d_u1.MoveNext()
}

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方法的命名约定

这就是为什么要匹配两个操作,方法的名称“默认”不用于匹配一个操作

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"}
            );              
    }
}

为什么不与你的控制器保持安静,而不是有两个帖子,当这真的是一个问题

    public CreateJobResponse Post(CreateJobRequest request)
    {
        return BusProxy.Call<CreateJobRequest, CreateJobResponse>(request);
    }

    public GetJobResponse Get(int id)
    {
        return BusProxy.Call<GetJobRequest, GetJobResponse>(id);
    }
公共CreateJobResponse帖子(CreateJobRequest请求) { 返回BusProxy.Call(请求); } 公共GetJobResponse获取(int id) { 返回BusProxy.Call(id); }
我也遇到了类似的问题,这不是路由定义问题-问题在于调用的签名似乎是相同的,因此是多操作问题。错误消息的其余部分实际上非常有用,因为它明确指出了它无法解决的多操作。在我的情况下,我的帖子是retur选择复杂类型:

// POST: api/Transfer
[ResponseType(typeof(Transfer))]
public IHttpActionResult PostTransfer(Transfer transfer)
它与同一文件中具有类似签名的方法混淆:

public TransferResponse doTransfer(Transfer transfer)
我有点震惊,路由匹配的例程不是以“Post”开头的。我尝试更改路由。我尝试更改方法的名称,但没有任何区别。所做的工作是将调用签名更改为略有不同-在本例中,添加了一个垃圾bool值:

public TransferResponse doTransfer(Transfer transfer, bool foo)

然后,路由很愉快,再次工作。

GetJobRequest和CreateJobRequest对象是什么样子的?我想可能它们都匹配您的请求对象,为什么GetJob HttpPost?不,它们不同。它必须是一个Post,因为我们使用的服务总线不接受GET请求中的参数e仍然缺少一些信息。只有一个路由和一个操作,您无法获得“多个操作…”错误。仅发布您想要点击的操作的代码无法帮助我们了解为什么它会点击您未发布的其他操作之一。我发布了两个操作,对吗?GetJob和CreateJob。至于路由,是的,这是o我只有一个。两个路由在默认值中有相同的操作,对吗?默认值:new{Controller=“SBKob”,Action=“CreateJob”}
public TransferResponse doTransfer(Transfer transfer, bool foo)