Angular 7 + dotnet核心+ SignalR IIS问题

时间:2019-03-05 04:21:20

标签: c# angular iis asp.net-core signalr

我正在尝试在本地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/en-us/aspnet/core/host-and-deploy/iis/?view=aspnetcore-2.2

我从Visual Studio发布,这将创建一个目录,其中包含.net Core DLL和Angular站点的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客户端网页
  • localhost:5000 / host失败并显示:
  

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

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

有人对如何通过IIS进行操作有任何想法吗?我整个下午都在挠头。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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