繁体   English   中英

Angular 7 + dotnet核心+ SignalR IIS问题

[英]Angular 7 + dotnet core + SignalR IIS Issue

我正在尝试在本地IIS上部署Angular 7 / .net Core应用程序,并且遇到了问题。 我在Visual Studio中使用了Angular模板来创建带有Angular前端的.net核心后端。 我还将SignalR添加到两个项目中。 以下是一些代码示例:

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("CorsPolicy",
            builder => builder
            .AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader()
            .AllowCredentials());
    });

        services.AddSignalR();
        services.AddSpaStaticFiles(configuration =>
        {
            configuration.RootPath = "ClientApp/dist";
        });
    }



public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
    else
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for 
       production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseStaticFiles();
app.UseSpaStaticFiles();
app.UseCors("CorsPolicy");
app.UseSignalR(routes =>
{
   routes.MapHub<MyHub>("/myHub");
});

app.UseSpa(spa =>
{
    // To learn more about options for serving an Angular SPA from ASP.NET Core,
    // see https://go.microsoft.com/fwlink/?linkid=864501
   spa.Options.SourcePath = "ClientApp";

    if (env.IsDevelopment())
    {
        spa.UseAngularCliServer(npmScript: "start"); 
    }
});
}

connection.service.ts

if (!this.hubConnection) {
    this.hubConnection = new 
    HubConnectionBuilder().withUrl('http://localhost:5000/myhub').build();
}

public start(): void {
    this.hubConnection
    .start()
    .then(() =>  {
        console.log('Connection started');
        this.startingSubject.next();
    })
    .catch((error: any) =>  this.startingSubject.error(error));
  }

data.component.ts

private getAllData(): Promise<Data> {
  const publishDate = this.getPublishDate();
  return this.connectionService.hubConnection.invoke("GetAllData", 
          publishDate);
}

快速总结,我有一个连接服务来处理Angular侧的signalR连接。 本质上,app.component.ts调用connection.service.ts中的Start()方法,该方法启动SignalR连接。 data.component.ts订阅了此事件,连接成功后,它将调用GetAllData()方法。

我试图按照本教程通过IIS进行设置,但无法正常工作。 https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/iis/?view=aspnetcore-2.2

我从Visual Studio发布,这将为我的Angular站点创建一个包含.net Core DLL和ClientApp文件夹的目录。 如果我执行dotnet myapp.dll命令,则可以导航至localhost:5000,并且一切正常。

  • localhost:5000 / myhub从我的signalR集线器返回响应
  • localhost:5000 / client完美显示signalR客户端网页
  • localhost:5000 / host完美显示signalR主机网页。

我还应该注意,这也可以通过VS运行。 但是,当我通过IIS运行时,会得到以下结果:

  • localhost:5000 / myhub从我的signalR集线器返回响应
  • localhost:5000 / client完美显示signalR客户端网页
  • 本地主机:5000 /主机失败,并显示以下信息:

错误错误:未捕获(承诺):错误:调用服务器上的“ GetAllData”时发生意外错误。 错误:在服务器上调用“ GetAllData”时发生意外错误。

/ Host确实尝试调用/ myhub,这使我想知道IIS是否存在与此端口或其他端口进行通信的问题。 也许我只是在设置IIS错误。

是否有人对如何通过IIS发挥作用有任何想法? 我整个下午都在挠头。

编辑:继续进行故障排除之后,好像data.component.ts在“ GetAllData”方法之前成功在集线器上调用了“ Connect”方法。

public Data GetAllData(DateTime? publishDate) 
{
   ... Logic here
}

PublishDate应该允许空值(在这种情况下,实际上是将null传递给此方法),是否有可能由于某种原因而不允许这样做? 再次,我很难理解为什么它可以在IIS之外的所有环境下工作,但是我很难理解这一点。 看起来奇怪的是,Connect()可以工作,但GetAllData()不在同一个集线器上时就不能工作。

再进行一次编辑我研究得越深入,就越发现GetAllData()方法中存在实际异常。 我正在努力验证这一点,但是我认为正在发生的事情是我有一个尝试访问的文件路径,但是在构建应用程序时该文件路径不存在。 我不是100%知道为什么它仅对IIS失败,但我仍在继续研究。 我将发布我的发现,以防其他人偶然发现这个非常具体的问题:)

我可能已经错过了..但是您的MyHub课程在哪里? 像这样:

 Public class MyHub : Hub {  
  Public async Task GetAllData() {  
      *logic here for when client calls hub*  
   }  
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM