我正在运行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开发服务器一起使用,因为那里使用不同的端口。
您需要在web.config文件中为API添加URL重写规则/设置。
默认情况下,您的域将查找角度路由(因为大多数角度应用程序会将SpaRewriteRule提到为“ *”,否则您的IIS托管应用程序将路由至Controller / Action方法路由)您需要在web.config文件中添加重写URL配置的特定URL的角度路由]
<rewrite>
<rules>
<rule name="SpaRewriteRule" stopProcessing="true">
<match url=".*"/>
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
<add input="{REQUEST_URI}" pattern="^/(api)" negate="true"/>
</conditions>
<action type="Rewrite" url="/index.html"/>
</rule>
<rule name="ApiProxyRule" stopProcessing="true"> // add this rule
<match url="api/(.*)"/>
<action type="Rewrite" url="http://YOUR_API_URLS/api/{R:1}"/>
</rule>
</rules>
</rewrite>