C# 使用属性路由在Web Api中找到多个与请求匹配的操作
出于好奇,我试图用重载的数量构建API 起初,我得到了下面的错误 - 不过,我还是想尝试一下与上面链接中提到的不同的方法 我继续并用C# 使用属性路由在Web Api中找到多个与请求匹配的操作,c#,asp.net,asp.net-web-api2,asp.net-web-api-routing,C#,Asp.net,Asp.net Web Api2,Asp.net Web Api Routing,出于好奇,我试图用重载的数量构建API 起初,我得到了下面的错误 - 不过,我还是想尝试一下与上面链接中提到的不同的方法 我继续并用[Route]装饰了我的API&下面是我的API的样子 namespace CTB_APP.Controllers.API.Delete { [RoutePrefix("api/test/")] public class TestController : ApiController { [Route("name")] public string Ge
[Route]
装饰了我的API&下面是我的API的样子
namespace CTB_APP.Controllers.API.Delete
{
[RoutePrefix("api/test/")]
public class TestController : ApiController
{
[Route("name")]
public string Get(string param)
{
return param + 1;
}
[Route("age")]
public int Get(int param)
{
return param + 1;
}
}
}
我认为上述API可以很容易地在各自的端点提供服务
http://localhost:51370/api/test/name?param=Chetan
http://localhost:51370/api/test/age?param=28
但这将返回以下错误
{
“消息”:“未找到与请求URI“”匹配的HTTP资源。”,
“MessageDetail”:“在控制器“测试”上找不到与名称“年龄”匹配的操作。”
}
请注意,已启用属性路由
WebAPIConfig.cs
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "ApiByAction",
routeTemplate: "api/{controller}/{action}",
defaults: new { action = "Get" }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
我怎样才能解决这个问题
谢谢。如果您没有告诉路由本身需要一个参数,请尝试将路由的属性注册为:
[Route("name/{param=param}")]
如果这不起作用,请尝试:
[HttpGet, Route("name/{param=param}")]
相关的当我测试它时,我本能地从路由前缀中删除了额外的斜杠
/
,它就工作了
因此,您的问题是在路由前缀中添加了斜杠,我认为这是不允许的
[RoutePrefix("api/test/")]
导致以下错误
“名为test
的控制器上的路由前缀api/test/
不能以/
字符结尾”
删除管线模板末尾的斜线
[RoutePrefix("api/test")]
下面的内存测试用于验证预期的行为
[TestClass]
public class MyTestClass {
[Test]
public async Task __WebApi_Should_Match_Route() {
//Arrange
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
var httpServer = new HttpServer(config);
var client = new HttpClient(httpServer);
//Act
var response = await client.GetAsync("http://localhost/api/test/age?param=28");
var returnJson = await response.Content.ReadAsStringAsync();
//Assert
response.IsSuccessStatusCode.Should().BeTrue();
var result = JsonConvert.DeserializeObject<int>(returnJson);
result.Should().Be(29);
}
}
[RoutePrefix("api/test")]
public class TestController : ApiController {
[Route("name")]
public string Get(string param) {
return param + 1;
}
[Route("age")]
public int Get(int param) {
return param + 1;
}
}
参考文献
结束点1:
结束点2:包括
[HttpGet]
,看看这是否会导致difference@Nkosi,在查询字符串中传递参数不是我个人喜欢的事情,我只是尝试一下,因此没有添加配置,理想情况下,我会将端点结构为http://localhost:51370/api/test/name?param=Chetan
我将试着看看我是否能重现你的测试结果,它会按预期运行。好的,我找到了答案。当我测试它时,我本能地从路由前缀中删除了额外的斜杠/
,它就工作了。因此,您的问题是在路由前缀中添加了斜杠。您的意思是,在您的情况下,您不需要更新[route(“age/{param}”)]
否。我只删除了多余的斜杠,其他一切都起作用。在我的情况下,它没有传输,您可以将您的src上传到某个云(dropbox)&共享吗,返回的错误消息表示“名为test
的控制器上的路由前缀api/test/
不能以/
字符结尾”是。它服务!!但不管怎样,检查NKSOI提到的方法!!感谢您暂时更新您的帖子。已在我的应用程序中进行了测试,并按预期工作:)
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
// Attribute routing.
config.MapHttpAttributeRoutes();
// Convention-based routing.
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
namespace CTB_APP.Controllers.API.Delete
{
[RoutePrefix("api/test/")]
public class TestController : ApiController
{
[Route("name/{param}")]
public string Get(string param)
{
return param + 1;
}
[Route("age/{param}")]
public int Get(int param)
{
return param + 1;
}
}
}