我正在尝试创建一个简单的.Net Core 2应用程序,该应用程序具有Angular前端和api/db后端。
我不想使用MVC,因为我不需要典型的点网视图或模型,但我在提供index.html文件和将api调用路由到控制器时遇到了问题。
我知道它在program.cs中的某个地方,涉及路线,但我一直很难找到关于如何在不使用mvc包的情况下做我想做的事情的文档。
简单地说,这里又是我的要求:
- 在路由到根时提供我的angular index.html文件(让angular处理那里的其余路由)
- 将my/api路由路由到c#dot网络控制器
- 不使用MVC
谢谢!
您可以使用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运行相同的Controller管道,因此您可以将MVC视为Web API和MVC的结合。
对于大多数常见的用例,使用MVC仍然是一条路要走。上述方法非常适合微服务或一次性请求,因为这可能会为您带来一点性能提升,因为它不必加载任何MVC位或激发到该管道中,但您要负责自己的序列化和请求处理。
作为一种替代方案,您可以始终使用.AddMvcCore()
激活MVC,并使用.AddJsonFormatters()
打开JSON格式化程序(我假设您的API将是JSON)。
在这种情况下,您将继承ControllerBase
而不是Controller
。
如果您启用了静态文件,您只需将index.html
放在webroot(wwwroot
)的顶层,它将作为默认文档。Angular应用程序将接管它们,与您在后端构建的API进行交互。