【问题标题】:Unified MVC Controller Routing in Asp.Net 5Asp.Net 5 中的统一 MVC 控制器路由
【发布时间】:2015-09-07 16:29:46
【问题描述】:

在我使用 ASP.NET 5 的过程中,我对一些统一的控制器概念感到困惑。请告诉我我做错了什么。

在 ASP.NET 5 中,相同的控制器用于 MVC 和 WebApi,只是在 Web Api 控制器上方定义的路由属性不同。我的想法是“路线”属性仅用于定义路线。但是在某些情况下,在顶部定义“Route”属性会将控制器指定为 Web Api 控制器。

在 Startup.cs 中,我有以下路由配置。

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

            routes.MapWebApiRoute(
                "DefaultApi",
                "api/{controller}/{id?}");
        });

在 Home Controller 中,有“HttpGet”动作用于接受 WebApi get 请求,但没有“Route”属性就无法调用,但启动类中已经定义了 web api 的路由。

public class HomeController : Controller {
    public IActionResult Index() {
        return View();
    }

    //[Route("api/[controller]")]
    [HttpGet]
    public IEnumerable<string> Get() {
        return new string[] { "value1", "value2" };
    }
}

在 Values 控制器中,无法访问“About”操作,因为对“/values/about”的调用将给出错误not found。并且“/api/values/about”将重定向到“Get”操作。

[Route("api/[controller]")]
public class ValuesController : Controller {
    public IActionResult About() {
        ViewData["Message"] = "Your application description page.";

        return View();
    }

    // GET: api/values
    [HttpGet]
    public IEnumerable<string> Get() {
        return new string[] { "value1", "value2" };
    }
}

但是虽然我在 startup.cs 文件中指定了 web api 路由,但我无法访问“/api/home”路径。 我做错了什么?

【问题讨论】:

  • 抱歉,我在您所写的内容中找不到问题。可以澄清一下吗?
  • 我的问题是,我在startup.cs文件中指定了web api路由,但是我无法访问“/api/home”路径

标签: url-routing asp.net-core


【解决方案1】:

我相信您正在混合使用不同的路由方法。

由于控制器是统一的,所以你不必为 webapi 指定一个路由,为 MVC 指定另一个。

MapWebApiRoute 函数仅用于向后兼容为旧版 WebApi 2 ASP.NET 编写的代码。

如果你想使用基于约定的路由,你可以像这样将 UseMvc 留空:

app.UseMvc();

有关不同选项的详细说明,请参阅这篇有用的博文:ASP.NET 5 Deep Dive: Routing

另请参阅this question,了解 ASP.NET 5 中 MVC 和 WebApi 控制器之间不存在的差异。

【讨论】:

  • 谢谢,但这很令人困惑。路由模块不应与 mvc 和 web api 控制器混合。两者是非常不同的概念。仅添加“路由”属性不应将 mvc 操作转换为 Web api。
  • 好吧,正如你所提到的,MVC 和 WebApi 在 ASP.NET 5 中合并。另见 aspnetmvc.readthedocs.org/projects/mvc/en/latest/migration/…
  • 我认为即使在合并它们之后,api也应该被支持并且路由应该是单独的。添加像 [HTTPGET] 这样的注释应该添加 web api 操作。添加路由属性应该只定义到动作的路由。
  • 请参阅我的编辑,并对此主题提出额外问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
相关资源
最近更新 更多