C# WebAPI中带有重载Get方法的路由问题

C# WebAPI中带有重载Get方法的路由问题,c#,asp.net-web-api,asp.net-web-api2,C#,Asp.net Web Api,Asp.net Web Api2,我在Product controller中有两种获取方法,如下所示: public IHttpActionResult Get(string keywordSearch) [Route("api/Product/{id:long}")] public IHttpActionResult Get(long id) 以下url有效: http://localhost:61577/api/Product?keywordSearch=test http://localhost:61577/api/P

我在Product controller中有两种获取方法,如下所示:

public IHttpActionResult Get(string keywordSearch)

[Route("api/Product/{id:long}")]
public IHttpActionResult Get(long id)
以下url有效:

http://localhost:61577/api/Product?keywordSearch=test
http://localhost:61577/api/Product/1
此操作失败,并显示以下消息:

http://localhost:61577/api/Product/test

{    
"Message": "No HTTP resource was found that matches the request URI 'http://localhost:61577/api/Product/test'.",
"MessageDetail": "No action was found on the controller 'Product' that matches the request."
}
WebApiConfig.cs具有以下配置:

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

请给出建议,我应该在API函数或配置中进行哪些更改以使其正常工作。

您需要在路由配置中为这两种操作方法指定路由,例如:

// for number type parameter only
config.Routes.MapHttpRoute(
    name: "IdSearch",
    routeTemplate: "api/{controller}/{id}",
    defaults: null,
    constraints: new { id = @"^\d+$" } // Only integers 
);
然后为字符串参数注册另一个参数:

// for string parameter overload action route
config.Routes.MapHttpRoute(
    name: "KeyWordSearch",
    routeTemplate: "api/{controller}/{keywordSearch}",
    defaults: null
);
在您的操作声明中,对字符串参数重载1应用Property属性值,使两者看起来像:

[Route("api/Product/{keywordSearch}")]
public IHttpActionResult Get(string keywordSearch)

[Route("api/Product/{id:long}")]
public IHttpActionResult Get(long id)
另一种方法是,您可以在控制器类上使用
RoutePrefix
,然后在操作方法上使用
Route
属性,这样您就不必在每个操作方法上重复Route的前缀:

[RoutePrefix("api/product")] 
public class ProductController : ApiController
{
    [Route("{keywordSearch}")] 
    public IHttpActionResult Get(string keywordSearch)

    [Route("{id:long}")]
    public IHttpActionResult Get(long id)
}
这会让你继续前进


希望有帮助

您需要在路由配置中为这两种操作方法指定路由,例如:

// for number type parameter only
config.Routes.MapHttpRoute(
    name: "IdSearch",
    routeTemplate: "api/{controller}/{id}",
    defaults: null,
    constraints: new { id = @"^\d+$" } // Only integers 
);
然后为字符串参数注册另一个参数:

// for string parameter overload action route
config.Routes.MapHttpRoute(
    name: "KeyWordSearch",
    routeTemplate: "api/{controller}/{keywordSearch}",
    defaults: null
);
在您的操作声明中,对字符串参数重载1应用Property属性值,使两者看起来像:

[Route("api/Product/{keywordSearch}")]
public IHttpActionResult Get(string keywordSearch)

[Route("api/Product/{id:long}")]
public IHttpActionResult Get(long id)
另一种方法是,您可以在控制器类上使用
RoutePrefix
,然后在操作方法上使用
Route
属性,这样您就不必在每个操作方法上重复Route的前缀:

[RoutePrefix("api/product")] 
public class ProductController : ApiController
{
    [Route("{keywordSearch}")] 
    public IHttpActionResult Get(string keywordSearch)

    [Route("{id:long}")]
    public IHttpActionResult Get(long id)
}
这会让你继续前进

希望有帮助

你帮了我。我在代码中做了以下更改,它就可以正常工作了。1.添加了RoutePrefix
[RoutePrefix(“api/产品”)]
公共类产品控制器:ApicController
2。添加了路由
[Route(“{keywordSearch}”)]
公共IHttpActionResult获取(字符串关键字搜索)
您的解决方案帮助了我。我在代码中做了以下更改,它就可以正常工作了。1.添加了RoutePrefix
[RoutePrefix(“api/产品”)]
公共类产品控制器:ApicController
2。添加了路由
[Route(“{keywordSearch}”)]
公共IHttpActionResult获取(字符串关键字搜索)