web api中两个diff方法的相同方法签名

时间:2018-02-26 12:59:09

标签: c# .net asp.net-web-api asp.net-web-api-routing

它可能有重复,但我没有找到正确的解决方案,

我的网页api,

public class SampleController : ApiController
{
    public string Get(int id)
    {
        return "value";
    }

    public string hello(int id)
    {
        return "value";
    }
} 

我的webapiconfig,

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

我的问题是

当我打电话给http://localhost:1234/api/Sample/5时它会点击Get(int id)但我怎么能调用方法2,即hello(int id)??什么需要改变,以及处理这类情景的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

<强> TLDR:

如果要在Web API中引用各个操作,请将路由更改为:

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

然后您可以像这样访问您的操作:localhost / api / {controller} / {action} /。请查看here以获取更多信息,尤其是"Routing by Action Name"

<强>原稿:

您似乎期望与MVC控制器具有相同的行为。 MVC控制器的标准路由是这样的:

routeTemplate: "{controller}/{action}/{id}"

这对应于控制器的名称,要使用的方法和某种形式的输入。 ApiControllers路线不同:

routeTemplate: "staticPart/{controller}/{id}"

正如您所看到的,只有对单个控制器和输入的引用,以及&#34; staticPart&#34;通常是/ api /

这个想法是你使用RESTful方法,用不同类型的http方法连接方法(例如DELETE,GET,POST,PUSH和PUT)

您的示例中的Get方法是一个特殊的,因为通过名称&#34; Get&#34;你告诉编译器这个方法与HTTP-GET相对应。

所以要回答你的问题:要么将路由更改为MVC-Controller的路由。这样您就可以在请求中引用各个操作,或者使用不同的HTTP方法。或者您按照MaxB

所示单独设置路线

您可以找到有关Web API路由的官方概述here您可以找到有关所有可能性的示例。