【发布时间】:2020-05-26 16:15:43
【问题描述】:
我正在运行托管在 IIS 10 中托管的 ASP.NET Core 3.1 上的 Angular 8 SPA 应用程序。
我有一个用例,应用程序的用户收到一封电子邮件,其中包含指向 Web API 控制器方法的超链接。
例如:
https://test.myapp.fr/api/ExternalCommands/ManageDati?a=C3hl5%2FMgXdldyX4ssmgyayMP3xE%2Bi%2
当通过 HTTP 客户端(在我的例子中为 ARC)使用此 URL 时,它可以工作。
如果通过默认浏览器使用它,同时托管 SPA 应用程序,它会失败而无法按原样到达服务器。它被重写以到达 notFound 组件:
https://test.myapp.fr/notFound?a=C3hl5%2FMgXdldyX4ssmgyayMP3xE%2Bi%2
这里是控制器方法:
[HttpGet]
[AllowAnonymous]
public async Task<IActionResult> ManageDati(string a, CancellationToken cancellationToken)
{
}
组件:
我在这里有什么选择?我是否应该在 SPA 应用范围之外托管 Web api?
编辑:这是默认路由配置:
app.UseMvc(routes =>
{
routes.MapRoute("externalcommands", "api/ExternalCommands/{action}/{id?}", defaults: new { controller = "ExternalCommands", action = "ManageDati" });
routes.MapRoute(name: "default", template: "api/{controller}/{action}/{id?}");
});
编辑 2:
为了证明我的观点,请求永远不会到达服务器,我在 app.router.ts 中启用了 Angular 路由器跟踪:
...
@NgModule({
imports: [RouterModule.forRoot(APP_ROUTES, { enableTracing: true })],
...
我可以看到 Angular 路由器逻辑正在处理我的请求并重定向到 notFound 组件。
在 IIS Express 下的调试器中运行的同一个应用程序可以正常工作:URL 按原样发送到服务器,角度路由器什么也不做。
确实很奇怪。
编辑 3:
这适用于 IIS Express / Angular Live 开发服务器,因为它们使用不同的端口。
【问题讨论】:
-
ManageDati方法的路由是什么?过去我不得不告诉 IIS 使用重写规则忽略“api”请求
-
我不明白你为什么在路由的末尾有 {id?}。这使得可以使用一个可选参数,例如 test.myapp.fr/api/ExternalCommands/ManageDati/5 是 5 的 id。你需要那个吗?
-
我使用将 Angular 应用程序部署在 /app 等子文件夹中,然后您对 /api 的请求将到达 IIS
-
@JavierFromMadrid 是的,我需要这个参数。我会将 api 部署到不同的域来解决我的问题。
标签: c# angular asp.net-core single-page-application angular8