具有CustomNames的MVC APIController

时间:2019-06-25 06:37:41

标签: c# rest asp.net-core routing

因此,我对netcoreapp还是陌生的,并试图将旧的rest api转换为新的api。

问题在于我无法使用自定义方法的名称和参数。

我只想拥有[HttpGet][HttpPost],然后拥有操作和参数。

例如

[HttpGet]
public List<string> GetStrings(string firstString, string lastString){
 // my code here
}

然后我尝试调用它,这根本不起作用

baseUrl/controller/GetStrings?firstString=test&lastString=test2

请在下面查看我的控制器以了解我的问题

[ApiController]
[Route("api/[controller]")]
public class YoutubeController : ControllerBase, IYoutubeController
{
    [HttpPost]
    public async Task<YoutubeVideoInfo> GetVideoAsync(string videoId)
    {
        // my code
    }

    [HttpGet]
    public List<YoutubeItem> Playlist([FromQuery]string playlistId)
    {
        // My code
    }

    [HttpGet]
    public YoutubeVideoCollection Search(string searchString, int pageSize = 50, string relatedTo = null, VideoSearchType videoSearchType = VideoSearchType.Videos)
    {
     // my code
    }
}

}

我尝试过这样的Calling Search,但是没有运气

https://localhost:44330/Youtube.Manager.Core.API/api/Youtube/Search?searchString=Eminem&pageSize=20&relatedTo=&videoSearchType=Videos

这是我的路由配置

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

我是否需要其他配置,也请不要在我的[HttpGet]属性中指定太多内容。

在网络框架中,我有WebApiConfig可以处理这种操作。 netcoreapp中没有类似的东西吗?

2 个答案:

答案 0 :(得分:1)

这样装饰您的控制器:

[ApiController]
[RoutePrefix("api/[controller]")]
public class YoutubeController : ControllerBase, IYoutubeController
{
    [HttpPost, Route("GetVideoAsync")]
    public async Task<YoutubeVideoInfo> GetVideoAsync(string videoId)
    {
        // my code
    }

    [HttpGet, Route("Playlist")]
    public List<YoutubeItem> Playlist([FromQuery]string playlistId)
    {
        // My code
    }

    [HttpGet, Route("Search/{searchString}/{pageSize}/{relatedTo}/{videoSearchType}")]
    public YoutubeVideoCollection Search(string searchString, int pageSize = 50, string relatedTo = null, VideoSearchType videoSearchType = VideoSearchType.Videos)
    {
     // my code
    }
}

并在RouteConfig中添加以下行:

routes.MapMvcAttributeRoutes();

答案 1 :(得分:1)

要使操作名称成为路由的一部分,您需要更新[Route(..)]属性以将操作考虑在内。您已在示例中使用了[controller]令牌,因此只需添加[action]

[Route("api/[controller]/[action]")]

有关令牌替换的详细说明,请参见docs