signalR + IIS 404 协商 angular4 客户端(1.0.0-preview1-final)
signalR + IIS 404 negotiate angular4 client (1.0.0-preview1-final)
我正在使用 ASP.NET Core 2.0 和 Microsoft.AspNetCore.SignalR (1.0.0-preview1-final)。
我在使用 IIS(通过 Kestrel)部署我的应用程序时遇到问题。
当我使用 IIS Express 运行 本地主机中的服务器时,一切都按预期工作,但是当我尝试在 IIS 上 运行(Windows 服务器或本地主机 windows 7)时,协商调用失败 404
POST http://localhost/notification/negotiate 404 (Not Found)
我尝试使用在网上找到的不同主题配置 IIS,但没有成功。 (<modules runAllManagedModulesForAllRequests="true" />
,无扩展名 url 和 https://support.microsoft.com/en-gb/help/980368/a-update-is-available-that-enables-certain-iis-7-0-or-iis-7-5-handlers)
但我仍然很确定问题与我的 IIS 配置有关,因为整个项目在 IIS Express 上运行良好...
这是测试服务器上使用的web.config
文件
(我删除了不同的调试尝试,因为它不起作用...)
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath=".\MyProject.Web.App.exe" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
</system.webServer>
</configuration>
<!--ProjectGuid: {{some GUID here}}-->
Configure
方法中使用的部分代码
app.UseSignalR(route =>
{
route.MapHub<NotificationHub>("/notification");
});
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
routes.MapSpaFallbackRoute(
name: "spa-fallback",
defaults: new { controller = "Home", action = "Index" });
});
ConfigureServices
方法中使用的部分代码
services.AddMvc()
services.AddSignalR();
services.AddSession();
Angular申请代码
constructor() {
/** ... **/
this.hubConnection = new HubConnection('/notification', {
transport: TransportType.LongPolling
});
this.hubConnection.on('Update', (data: string) => {
let res = new DefaultNotificationInfo(data);
/** ... **/
});
this.hubConnection.start()
.then(() => {
this.join().then(next => {
// nothing to do on join, the socket is running
}).catch(error => {
console.error(error)
});
})
.catch(err => {
console.error(err)
});
}
private join(): Promise<any> {
return this.hubConnection.invoke('Join');
}
版本信息:
IIS : 7.5
APP网package.json:
{
/** ... **/
"@aspnet/signalr": "^1.0.0-preview1-update1",
"@aspnet/signalr-client": "^1.0.0-alpha2-final",
/** ... **/
}
API asp net nuget 版本:(1.0.0-preview1-final)
阅读后
https://blogs.msdn.microsoft.com/webdev/2017/09/14/announcing-signalr-for-asp-net-core-2-0/ 和
https://blogs.msdn.microsoft.com/webdev/2018/02/27/asp-net-core-2-1-0-preview1-getting-started-with-signalr/,我很确定我已经涵盖了他们 tutorial/quick-start
中的所有内容
有什么我遗漏的吗?
更新 1
找到这个之后:
我尝试使用此 link https://blogs.msdn.microsoft.com/vijaysk/2009/03/08/iis-7-tip-3-you-can-now-load-the-user-profile-of-the-application-pool-identity/
启用我的 ApplicationPool 的 LoadUserProfile 属性
但这还是404失败
我还尝试 "Attach to process" 在我的应用程序上查看是否有任何日志对应于我的 Hub
或 /negotiate
url,但是有 none.
(还附上了404结果的截图)
更新 2
这是 package.config 来自 Web.App
的摘录
更新 3
这是托管应用程序的服务器的配置。
您可以看到 3 个不同的网站。它们都具有几乎相同的配置。 (只是端口变了,定义了3种不同的测试环境访问)
这是基本的本地主机开发人员 IIS,我想它是由 Visual Studio 生成的。
您的中间件管道中是否有 app.UseSPA()
?如果是这样,请尝试像这样
在 app.UseSignalR()
之后添加它
app.UseSignalR(routes =>
{
routes.MapHub<TestHub>("/hubs/test");
});
app.UseSpa((o) =>
{
if (env.IsDevelopment())
{
o.UseProxyToSpaDevelopmentServer("http://localhost:4200");
}
});
github 上有一个非常相似的问题。如果该网站未托管在根目录上(例如,通过使用虚拟目录或类似的东西),SignalR 将在撰写本文时使用错误的 URL。例如,如果您的 "website-root" 开启
http://YOUR_URL/test/index.html
你必须使用
this.hubConnection = new HubConnection('/test/notification', {
transport: TransportType.LongPolling,
logger: signalR.LogLevel.Trace
});
如果上述方法不起作用,我建议您将日志记录添加到您的客户端应用程序(如上所示)和您的服务器。这将告诉您到底出了什么问题。
我正在使用 ASP.NET Core 2.0 和 Microsoft.AspNetCore.SignalR (1.0.0-preview1-final)。
我在使用 IIS(通过 Kestrel)部署我的应用程序时遇到问题。 当我使用 IIS Express 运行 本地主机中的服务器时,一切都按预期工作,但是当我尝试在 IIS 上 运行(Windows 服务器或本地主机 windows 7)时,协商调用失败 404
POST http://localhost/notification/negotiate 404 (Not Found)
我尝试使用在网上找到的不同主题配置 IIS,但没有成功。 (<modules runAllManagedModulesForAllRequests="true" />
,无扩展名 url 和 https://support.microsoft.com/en-gb/help/980368/a-update-is-available-that-enables-certain-iis-7-0-or-iis-7-5-handlers)
但我仍然很确定问题与我的 IIS 配置有关,因为整个项目在 IIS Express 上运行良好...
这是测试服务器上使用的web.config
文件
(我删除了不同的调试尝试,因为它不起作用...)
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath=".\MyProject.Web.App.exe" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
</system.webServer>
</configuration>
<!--ProjectGuid: {{some GUID here}}-->
Configure
方法中使用的部分代码
app.UseSignalR(route =>
{
route.MapHub<NotificationHub>("/notification");
});
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
routes.MapSpaFallbackRoute(
name: "spa-fallback",
defaults: new { controller = "Home", action = "Index" });
});
ConfigureServices
方法中使用的部分代码
services.AddMvc()
services.AddSignalR();
services.AddSession();
Angular申请代码
constructor() {
/** ... **/
this.hubConnection = new HubConnection('/notification', {
transport: TransportType.LongPolling
});
this.hubConnection.on('Update', (data: string) => {
let res = new DefaultNotificationInfo(data);
/** ... **/
});
this.hubConnection.start()
.then(() => {
this.join().then(next => {
// nothing to do on join, the socket is running
}).catch(error => {
console.error(error)
});
})
.catch(err => {
console.error(err)
});
}
private join(): Promise<any> {
return this.hubConnection.invoke('Join');
}
版本信息:
IIS : 7.5
APP网package.json:
{
/** ... **/
"@aspnet/signalr": "^1.0.0-preview1-update1",
"@aspnet/signalr-client": "^1.0.0-alpha2-final",
/** ... **/
}
API asp net nuget 版本:(1.0.0-preview1-final)
阅读后 https://blogs.msdn.microsoft.com/webdev/2017/09/14/announcing-signalr-for-asp-net-core-2-0/ 和 https://blogs.msdn.microsoft.com/webdev/2018/02/27/asp-net-core-2-1-0-preview1-getting-started-with-signalr/,我很确定我已经涵盖了他们 tutorial/quick-start
中的所有内容有什么我遗漏的吗?
更新 1
找到这个之后: 我尝试使用此 link https://blogs.msdn.microsoft.com/vijaysk/2009/03/08/iis-7-tip-3-you-can-now-load-the-user-profile-of-the-application-pool-identity/
启用我的 ApplicationPool 的 LoadUserProfile 属性但这还是404失败
我还尝试 "Attach to process" 在我的应用程序上查看是否有任何日志对应于我的 Hub
或 /negotiate
url,但是有 none.
(还附上了404结果的截图)
更新 2
这是 package.config 来自 Web.App
的摘录更新 3
这是托管应用程序的服务器的配置。 您可以看到 3 个不同的网站。它们都具有几乎相同的配置。 (只是端口变了,定义了3种不同的测试环境访问)
这是基本的本地主机开发人员 IIS,我想它是由 Visual Studio 生成的。
您的中间件管道中是否有 app.UseSPA()
?如果是这样,请尝试像这样
app.UseSignalR()
之后添加它
app.UseSignalR(routes =>
{
routes.MapHub<TestHub>("/hubs/test");
});
app.UseSpa((o) =>
{
if (env.IsDevelopment())
{
o.UseProxyToSpaDevelopmentServer("http://localhost:4200");
}
});
github 上有一个非常相似的问题。如果该网站未托管在根目录上(例如,通过使用虚拟目录或类似的东西),SignalR 将在撰写本文时使用错误的 URL。例如,如果您的 "website-root" 开启
http://YOUR_URL/test/index.html
你必须使用
this.hubConnection = new HubConnection('/test/notification', {
transport: TransportType.LongPolling,
logger: signalR.LogLevel.Trace
});
如果上述方法不起作用,我建议您将日志记录添加到您的客户端应用程序(如上所示)和您的服务器。这将告诉您到底出了什么问题。