Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.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# 使用属性路由在Web Api中找到多个与请求匹配的操作_C#_Asp.net_Asp.net Web Api2_Asp.net Web Api Routing - Fatal编程技术网

C# 使用属性路由在Web 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

出于好奇,我试图用重载的数量构建API

起初,我得到了下面的错误

-

不过,我还是想尝试一下与上面链接中提到的不同的方法

我继续并用
[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;
   }
 }
}