Угловая 7 + дотнет ядро ​​+ SignalR IIS Issue - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь развернуть приложение Angular 7 / .net Core на моем локальном IIS и столкнулся с проблемой.Я использовал шаблон Angular в Visual Studio для создания ядра .net с интерфейсом Angular.Я также добавил 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);
}

В качестве краткого изложения, у меня есть служба соединений для обработки соединений signalR на угловой стороне.По сути, app.component.ts вызывает метод Start () в connection.service.ts, который запускает соединение 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 и папкой ClientApp для моего сайта Angular. Если я выполняю команду 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/ хост завершается с:

ОШИБКА Ошибка: Uncaught (в обещании): Ошибка: Произошла непредвиденная ошибка при вызове GetAllData на сервере Ошибка: Произошла непредвиденная ошибка при вызове GetAllData 'на сервере.

/ Хост пытается сделать вызов / myhub, что заставляет меня задуматься, не возникает ли у IIS проблема с этим соединением с тем же портом или чем-то еще.или, может быть, я просто неправильно настраиваю IIS.

У кого-нибудь есть идеи, как заставить это работать через IIS?Я весь день ломал голову над этим.

Редактировать: После продолжения устранения неполадок похоже, что data.component.ts успешно вызывает метод "Connect" вКонцентратор непосредственно перед методом «GetAllData».

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

PublishDate должен разрешать нулевые значения (в этом случае нулевой объект фактически передается этому методу), возможно ли, что это по какой-то причине запрещено?Опять же, мне трудно понять, почему это будет работать везде, кроме IIS, но я понимаю, что это точка зрения.Кажется странным, что Connect () будет работать, но GetAllData () не будет работать, если они находятся в одном концентраторе.

Еще одно редактирование Чем больше я исследую, тем больше это выглядит тамявляется действительным исключением в методе GetAllData ().Я работаю над проверкой этого, но думаю, что происходит то, что у меня есть путь к файлу, к которому я пытаюсь получить доступ, но этот путь к файлу не существует при сборке приложения.Я не уверен на 100%, почему это не работает только для IIS, но я продолжаю копать.Я опубликую свои выводы на случай, если кто-нибудь еще наткнется на эту очень специфическую проблему:)

1 Ответ

0 голосов
/ 05 марта 2019

Возможно, я пропустил это ... но где твой класс MyHub?Как то так:

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