【问题标题】:.net core routing via controller attribute.net核心路由通过控制器属性
【发布时间】:2018-04-18 12:08:04
【问题描述】:

我有一个获取路由属性的控制器:

[Route("api/v1/Admin/Keys")]
public class AdminController : Controller
{}

我的 Webproject 有以下路线:

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

错误:

找不到此本地主机页面 没有找到该网络的网页 地址:http://localhost:60907/

当尝试调用控制器上的方法时,该方法也被路由,我一直得到相同的结果。

如果我从控制器中删除路由属性,那么这将开始工作,但我没有得到所需的路由。

我做错了什么?

编辑:

我在浏览器中调用的方法:

    [HttpGet]
    [Route("GetAllKeys")]
    public async Task<IActionResult> GetAllKeys()
    {
        var data = await _manager.GetAllKeyTypes();

        return Ok(data);

    }

错误:

找不到此本地主机页面 没有找到该网络的网页 地址:http://localhost:60907/

EDIT2:

现在删除全局路由并仅使用:

  [HttpGet("GetAllKeys")]

并使用以下网址: http://localhost:60907/GetAllKeys

这行得通,但又不受欢迎

【问题讨论】:

    标签: c# api asp.net-core request


    【解决方案1】:

    如果您仅将[Route("api/v1/Admin/Keys")] 应用于控制器,则您必须使用/api/v1/Admin/Keys/GetAllKeys 访问GetAllKeys 操作。我不认为那是你想要的。

    试试这个:

    [Route("api/v1/Admin/Keys")]
    public class AdminController : Controller {
    
        [HttpGet("GetAllKeys")]
        public async Task<IActionResult> GetAllKeys()
        {
            var data = await _manager.GetAllKeyTypes();
    
            return Ok(data);
    
        }    
    }
    

    这表明AdminController 中的每个操作都在/api/v1/Admin/Keys 之下。然后HttpGet 属性告诉它GetAllKeys 应该可以通过/api/v1/Admin/Keys/GetAllKeys 获得。

    一旦你在控制器上设置了Route,看来你必须使用HttpGet来设置动作的路由,否则它就不起作用了。

    【讨论】:

    • 实际上 /api/v1/Admin/Keys/GetAllKeys 正是我想要的,但我不知道为什么它不起作用。 url 是“localhost:60907/api/v1/Admin/Keys/AllKeys”,但我得到:“找不到这个 localhost 页面”
    • @ThunD3eR 您需要调用 [..]/GetAllKeys,而不是 [..]/AllKeys
    • 我已经更新了我的答案。使用HttpGet 属性而不是Route 设置操作的路由。
    • 对不起 m8,图片有点不对劲。我正在调用 GetAllKeys
    • 我在我的一个应用程序中对此进行了测试。但请注意,在我的 Startup.cs 中,我有 app.UseMvc()(无参数)。
    【解决方案2】:

    约定路由不用于带有属性路由配置的控制器/动作。

    属性路由允许为同一个动作定义多个路由。你可以简单地做这样的事情:

    public class AdminController : Controller
    {
       [Route("")]
       [Route("Admin")]
       [Route("Admin/GetAllKeys")]
       [Route("api/v1/Admin/Keys")]
       public IActionResult GetAllKeys()
       { 
          ... 
       }
    }
    

    【讨论】:

      【解决方案3】:

      好吧……

      自我注意...不要修改 .net 核心中的端口。 我正在试验我的 API 和我的前端项目。 试图将它们放在同一个端口上,但使用不同的接入点。 它按照我的想法工作,即当 API 运行时,节点服务器无法在同一端口上启动。

      然而,这在某处引起了某种变化,后来当我改回 API 上的默认端口时,从未完全注册过。 我检查了 launchSettings.json 并进行了相应的修改,但这仍然不起作用。

      最终解决方案: 从我的电脑中删除了该项目并从我的仓库中取回它,现在它可以使用原始路由集正常工作。

      【讨论】:

      • 听起来不错。两个应用程序不能绑定到同一个 TCP 端口。如果您希望它们在同一个端口下工作,您必须使用 Web 服务器(如 IIS)作为代理,以便域的根将请求转发到您的前端,/api 转发到您的 API 应用程序.
      猜你喜欢
      • 2019-02-24
      • 1970-01-01
      • 2018-08-09
      • 2018-03-14
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多