当前位置: 首页 > 知识库问答 >
问题:

在Web Api中找到多个与请求匹配的操作

云锦
2023-03-14

我一直得到这个错误,当我尝试有2"获取"方法

找到多个与请求匹配的操作:webapi

我一直在寻找其他类似的问题,但我不明白。

我有两个不同的名称,并使用“HttpGet”属性

[HttpGet]
public HttpResponseMessage Summary(MyVm vm)
{
    return null;
}

[HttpGet]
public HttpResponseMessage FullDetails()
{
    return null;
}

共有3个答案

白镜
2023-03-14

在Web API中(默认情况下),方法是根据HTTP方法和路由值的组合来选择的。

MyVm看起来像一个复杂的对象,由格式化程序从主体中读取,因此在路由数据方面有两个相同的方法(因为它们都没有路由中的任何参数),这使得dispatcher(IHttpActionSelector)无法匹配相应的方法。

您需要通过querystring或route参数来区分它们以解决歧义。

花飞扬
2023-03-14

从Web API 2开始更新。

在WebApiConfig.cs文件中使用此API配置:

public static void Register(HttpConfiguration config)
{
    //// Web API routes
    config.MapHttpAttributeRoutes(); //Don't miss this

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

您可以像这样路由我们的控制器:

[Route("api/ControllerName/Summary")]
[HttpGet]
public HttpResponseMessage Summary(MyVm vm)
{
    return null;
}

[Route("api/ControllerName/FullDetails")]
[HttpGet]
public HttpResponseMessage FullDetails()
{
    return null;
}

其中ControlllerName是控制器的名称(不含控制器)。这将允许您获得上面详细描述的路线的每个动作。

进一步阅读:http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

伏建修
2023-03-14

在WebApiConfig中,您的路线图可能与此类似。反恐精英:

routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });

但是,为了使用相同的http方法执行多个操作,您需要通过以下路径向webapi提供更多信息:

routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional });

请注意,routeTemplate现在包含一个操作。更多信息请点击此处:http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

更新:

好吧,现在我想我明白你在想什么了,这是另一个观点:

也许您不需要actionurl参数,而应该用另一种方式描述您所关注的内容。既然您说这些方法是从同一个实体返回数据,那么就让这些参数为您做描述吧。

例如,您的两个方法可以变成:

public HttpResponseMessage Get()
{
    return null;
}

public HttpResponseMessage Get(MyVm vm)
{
    return null;
}

在MyVm对象中传递什么样的数据?如果您能够通过URI传递变量,我建议您走这条路线。否则,您将需要在请求正文中发送对象,而在执行GET时,这不是非常的HTTP(不过,它可以工作,只需在MyVm的前面使用[FromBody])。

希望这能说明,您可以在一个控制器中使用多个GET方法,而无需使用操作名称甚至[HttpGet]属性。

 类似资料:
  • 问题内容: 如果用户填充了一些无效数据,则会触发ajax请求并显示错误消息。现在,当用户再次更正数据/或再次输入无效数据时,将触发2个请求,下一次是3个,并且继续增加。 这可能是由于parsley js库。 如果我删除香菜代码,它可以正常工作。任何想法? 这是ajax代码 这是HTML代码段 任何线索将不胜感激。 问题答案: 我刚刚找到解决方案。这是因为我也在form标签和js中使用了data-p

  • 我试图运行python urllib2脚本,但出现以下错误: InsecurePlatformWarning:真正的SSLContext对象不可用。这将防止urllib3适当配置SSL,并可能导致某些SSL连接失败。有关详细信息,请参阅https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning. 在

  • 我是ASP的新手。网我对POST请求有问题。也许我的代码错了,我找不到在哪里! 当我尝试post请求时,Postman会向我发送错误消息: "ExceptionType":"System.网。http://http.不支持的媒体类型异常","StackTrace":"àSystem.网。http://http.HttpContent扩展。ReadAsAsync[T](HttpContent内容,类

  • 我在努力做一些简单而琐碎的事情--或者至少我认为。 我试图编写一个基类,可以由我旋转的每个微服务项目继承。这个基类的目的是测试从HTTP到SQL的连接性。在prod中没有启用它。 这是一个(更简单的)基类: 我希望把它用作:

  • 我正在研究Spring Cloud和Spring OAuth2,方法是分解这个GitHub示例中的三个相互连接的应用程序。当我在应用程序中打开endpoint,然后使用从应用程序调用它时,应用程序的调试日志在拒绝注销请求时会给出以下错误消息: 当应用程序从调用注销函数时,为了使全局注销成功,需要对示例GitHub应用程序中的代码进行哪些具体更改? 初步努力: 到目前为止,我所做的更改包括: 但是,

  • null 我正在CentOS Linux版本7.3.1611的虚拟环境中使用Python2.7。 我正在运行一个使用matplotlib.pyplot的脚本,运行时会出现以下错误 我试着用- 然后我甚至安装了- 并且它表示包已经安装并且 我已经重新设置了我的虚拟环境,看看我是否错过了什么,但我无法到达任何地方。请救命!