我正在尝试在本地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,一切正常。
我还应该注意,这也可以通过VS运行。但是,当我通过IIS运行时,会得到以下结果:
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失败,但我仍在继续研究。我将发布我的发现,以防其他人偶然发现这个非常具体的问题:)
答案 0 :(得分:0)
我可能已经错过了..但是您的MyHub课程在哪里? 像这样:
Public class MyHub : Hub {
Public async Task GetAllData() {
*logic here for when client calls hub*
}
}