Я пытаюсь развернуть приложение 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, но я продолжаю копать.Я опубликую свои выводы на случай, если кто-нибудь еще наткнется на эту очень специфическую проблему:)