【问题标题】:.Net Core 2 Routing without MVC.Net Core 2 没有 MVC 的路由
【发布时间】:2017-10-17 17:36:09
【问题描述】:

我正在尝试使用 Angular 前端和 api/db 后端创建一个简单的 .Net Core 2 应用程序。

我不想使用 MVC,因为我不需要典型的 dot net 视图或模型,但我无法提供我的 index.html 文件并将 api 调用路由到我的控制器。

我知道它位于 program.cs 中的某个位置并涉及路由,但我一直无法找到有关如何在不使用 mvc 包的情况下执行我想要的操作的文档。

简单地说,这是我的要求:

  1. 在路由到根时提供我的 angular index.html 文件(让 angular 处理那里的其余路由)
    1. 路由我的 /api 路由以路由到 c# dot net 控制器
    2. 不要使用 MVC

谢谢!

【问题讨论】:

  • 在 .NET Core 2.0 中,Web API 和 MVC 已合并到一个名为 MVC 的框架中。所以,如果你想添加 API 路由,你实际上是在寻找 MVC。
  • 我明白了。您能否为我提供一个如何提供 html 文件的示例?例如,为了服务于我的 Angular 应用程序,我不想路由到控制器操作并返回视图。我不应该需要控制器操作,对吧?
  • 我相信您只需要app.UseStaticFiles()
  • 但是路由中的代码是什么让像“...com/”和“...com/about/”这样的路由服务于 index.html 文件并将路由传递给 angular路由器?

标签: c# asp.net-mvc asp.net-core asp.net-core-2.0


【解决方案1】:

您可以使用 UseRouter() 中间件直接显式映射路由,作为应用程序配置管道的一部分。

例如,以下创建了一个自定义路由来处理 Lets Encrypt 请求,如果启用任何其他路由,默认情况下该请求将失败。以下代码进入服务器的Startup 类的Configure() 方法:

        // Handle Lets Encrypt Route(before MVC processing!)
        app.UseRouter(r =>
        {
            r.MapGet(".well-known/acme-challenge/{id}", async (request, response, routeData) =>
            {
                var id = routeData.Values["id"] as string;
                var file = Path.Combine(env.WebRootPath, ".well-known", "acme-challenge", id);
                await response.SendFileAsync(file);
            });
        });

这本质上使得简单的路由场景或将请求转发到其他处理程序变得非常容易。

请注意,这是一个原始接口,不包括任何超出原始请求/响应语义的输入或输出处理。

如果您使用 API 样式数据做任何事情,那么我仍然建议您使用 MVC 和控制器来处理您必须自己构建的各种事情。在 Core 中,API 和 MVC 运行相同的控制器管道,因此您可以将 MVC 视为 Web API 和 MVC 的组合。

对于最常见的用例,使用 MVC 仍然是可行的方法。上述方法非常适合微服务或一次性请求,因为这可能会为您带来一点性能提升,因为它不必加载任何 MVC 位或触发该管道,但您负责进行自己的序列化和请求处理。

【讨论】:

  • 所以我仍然应该使用控制器方法并通过它返回我的 index.html,对吗?
  • 对于 index.html 和类似的项目使用 StaticFile 中间件。它将处理一些最低级别的缓存并正确处理内容类型和过期。
【解决方案2】:

作为替代方案,您始终可以使用 .AddMvcCore() 激活 MVC,并使用 .AddJsonFormatters() 打开 JSON 格式化程序(我假设您的 API 将是 JSON)。

在这种情况下,您将继承自 ControllerBase 而不是 Controller

如果您启用了静态文件,您只需将 index.html 放在您的 webroot (wwwroot) 的顶层,它将作为默认文档。您的 Angular 应用程序将接管它们,与您在后端构建的 API 进行互操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 2019-01-02
    • 2020-04-17
    相关资源
    最近更新 更多