【问题标题】:signalR + IIS 404 negotiate angular4 client (1.0.0-preview1-final)signalR + IIS 404 协商 angular4 客户端(1.0.0-preview1-final)
【发布时间】:2018-03-28 22:41:23
【问题描述】:

我正在使用 ASP.NET Core 2.0 和 Microsoft.AspNetCore.SignalR (1.0.0-preview1-final)。

我在使用 IIS(使用 Kestrel)部署我的应用程序时遇到问题。 当我使用 IIS Express 在 localhost 中运行服务器时,一切正常,但是当我尝试在 IIS(Windows 服务器或本地主机 Windows 7)上运行时,协商调用失败 404

POST http://localhost/notification/negotiate 404(未找到)

我尝试使用网上找到的不同主题配置 IIS,但没有成功。 (<modules runAllManagedModulesForAllRequests="true" />,带有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网包.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/,我很确定我已经涵盖了他们的教程/快速入门中的所有内容

我错过了什么吗?


更新 1

找到这个后:https://stackoverflow.com/a/43014264/3198096 我尝试使用此链接 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。

我还尝试在我的应用程序上“附加到进程”以查看是否有任何与我的Hub/negotiate url 对应的日志,但没有。

(还添加了404结果的截图)

更新 2

这是从 Web.App 中提取的 package.config

更新 3

这是托管应用程序的服务器的配置。 您可以看到 3 个不同的网站。它们都具有几乎相同的配置。 (只是端口变化,定义了3种不同的测试环境访问)

这是基本的 localhost 开发人员 IIS,我猜我是由 Visual Studio 生成的。

【问题讨论】:

  • 您可以发布您的集线器的代码吗?你有身份验证吗?

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


【解决方案1】:

您的中间件管道中有app.UseSPA() 吗?如果是这样,请尝试像这样在app.UseSignalR() 之后添加它

 app.UseSignalR(routes =>
    {
        routes.MapHub<TestHub>("/hubs/test");
    });

app.UseSpa((o) =>
    {
        if (env.IsDevelopment())
        {
            o.UseProxyToSpaDevelopmentServer("http://localhost:4200");
        }
    });

https://github.com/aspnet/SignalR/issues/1511

【讨论】:

  • 我项目上没有UseSpa中间件,我添加了nuget依赖的图片,可能需要升级一些包才能得到?
  • @Kahbazi 该死!自从过去几天以来,我一直在疯狂地搜索互联网来解决这个问题。我经历了cors,但这一切都解决了我的问题,伙计......非常感谢!你拯救了我的一天!
【解决方案2】:

github 上有一个非常相似的问题。如果网站不是托管在根目录上(例如通过使用虚拟目录或类似的东西),SignalR 将在撰写本文时使用错误的 URL。例如,如果您的“website-root”已打开

http://YOUR_URL/test/index.html

你必须使用

this.hubConnection = new HubConnection('/test/notification', {
    transport: TransportType.LongPolling,
    logger: signalR.LogLevel.Trace
});

如果上述方法不起作用,我建议您将日志记录添加到您的客户端应用程序(如上所示)和您的服务器。这会告诉你到底哪里出了问题。

【讨论】:

  • 问题不是链接到虚拟文件夹,但 github 问题为我提供了答案。我没有使用正确的 BaseUrl,因此握手调用将指向 IIS 上的错误 URL(因为它不是托管在 root 上)...(您能否更新您的答案以指示更正,以便我可以授予您赏金并接受答案?)
  • @Humbertda 我试图更新解释。很高兴我能为您指明正确的方向。
猜你喜欢
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 2019-03-11
  • 2016-09-25
相关资源
最近更新 更多