【问题标题】:MVC APIController With CustomNames带有自定义名称的 MVC APIController
【发布时间】:2019-11-06 22:37:41
【问题描述】:

所以我是netcoreapp 的新手,我正试图将我的旧rest 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
    }
}

}

我尝试像这样调用搜索,但没有任何运气

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里没有类似的吗?

【问题讨论】:

  • 删除 [ApiController] 和 Route 部分,从那里您可以将 Route 属性添加到您的方法中
  • 是的,但这正是我不想要的。当我有控制器动作和参数时,mvc 应该知道该怎么做,因为没有冲突吧?

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


【解决方案1】:

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

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

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

【讨论】:

  • 是的,就是这样,它现在可以工作了。只有一个问题,如果我删除route attr,它不应该采用启动类中指定的设置,例如app.UseMvc(routes =&gt;,并使其成为全局设置吗?为什么它不起作用?
【解决方案2】:

像这样装饰你的控制器:

[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();

【讨论】:

  • app.UseMvc(routes=> `routes.MapMvcAttributeRoutes();` 不存在。我没有任何其他配置。我应该把这个放在哪里。我真的很想跳过使用 Route使用WebApiConfig时像过去的美好时光一样属性没有办法吗?
  • 但是您在控制器 [Route("api/[controller]")] 上使用 Route 属性。我没有得到跳过这个属性的部分。你能解释更多吗?
  • 是的,但我只用过一次。我不想在每种方法中都添加路线。在有更好的全球解决方案之前,我仍然会使用它。就像 WebApiConfig 之后将删除所有路由
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
相关资源
最近更新 更多