如何在asp.net-core-webapi中创建路由?

Ste*_*fan 2 c# asp.net-core-webapi

我正在尝试在我的.net核心web api中实现基本路由.

我有一个像这样的控制器:

[Route("api/[controller]")]
public class FooController : Controller
{
    //out of the box
    [HttpGet("[action]")] //get the list
    public IEnumerable<Foo> Get()
    {
      //omitted
    }

    //added: request detail request///
    [HttpGet("[action]/{fooid}")]
    public Foo Get(string fooid)
    {
      //omitted
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图使以下路线工作:

一个细节:

http://localhost:2724/api/Product/Get?fooid=myfoo1
Run Code Online (Sandbox Code Playgroud)

列表的一般内容:

http://localhost:2724/api/Product/Get
Run Code Online (Sandbox Code Playgroud)

问题是,?fooid=最终在IEnumerable版本的调用,我似乎无法正确.


我尝试了各种语法变体来克服这个问题,例如:[HttpGet("{fooid}")]但这似乎并没有帮助.

我知道我可以重命名这个方法,但我这样做是为了练习.

我也知道要求提供文件是不行的,但欢迎任何有关此事的帮助.

我还尝试添加一条路线:

app.UseMvc(routes =>
   {
       routes.MapRoute( //default
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");

        routes.MapRoute(
            name: "fooid",
            template: "{controller=Home}/{action=Index}/{fooid?}");

        routes.MapSpaFallbackRoute(
            name: "spa-fallback",
            defaults: new { controller = "Home", action = "Index" });
    });
Run Code Online (Sandbox Code Playgroud)

我尝试了这里描述的一些方法,但没有成功.

你能给我一些指示吗?

Sim*_*Ged 5

您的参数版本的URL不正确.它必须与您在HttpGet属性中编写的相同,例如

http://localhost:2724/api/Product/Get/myfoo1
Run Code Online (Sandbox Code Playgroud)

如果你确实想要将参数传递为?fooId = myFoo,那么你需要将你的方法声明为:

[HttpGet("[action]")]
public Foo Get([FromUri]string fooId)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)