通过HTTPS GET LINK调用Angular 8 WebAPI方法到控制器

问题描述 投票:0回答:1

我正在运行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)
{
}

组件:

enter image description here

我在这里有什么选择?我是否应该在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开发服务器一起使用,因为那里使用不同的端口。

c# angular asp.net-core single-page-application angular8
1个回答
1
投票

您需要在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>
© www.soinside.com 2019 - 2024. All rights reserved.