我的网站使用带有RC1-Update1的ASP.NET 5,与客户端的一些通信通过web套接字进行(使用SignalR)。
在测试过程中,我发现在IIS(或IIS Express)上运行时,无法通过套接字进行通信。SignalR回落到长轮询。
SignalR日志:
SignalR: Client subscribed to hub 'chathub'.
SignalR: Negotiating with '/signalr/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D'.
SignalR: serverSentEvents transport starting.
SignalR: Attempting to connect to SSE endpoint 'http://localhost:31650/signalr/signalr/connect?transport=serverSentEvents&c…wVlnXCY8bI7R8E&connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D&tid=2'.
SignalR: serverSentEvents transport timed out when trying to connect.
SignalR: EventSource calling close().
SignalR: serverSentEvents transport failed to connect. Attempting to fall back.
SignalR: foreverFrame transport starting.
SignalR: Forever Frame is not supported by SignalR on browsers with SSE support.
SignalR: foreverFrame transport failed to connect. Attempting to fall back.
SignalR: longPolling transport starting.
SignalR: Opening long polling request to 'http://localhost:31650/signalr/signalr/connect?transport=longPolling&client…8WRrhWwVlnXCY8bI7R8E&connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D'.
SignalR: Long poll complete
经过长时间的调试,我通过命令行直接通过dnx(没有IIS或其他任何东西)启动了我的网站,使用:
dnx web
web套接字开箱即用,没有任何问题。
在我研究该解决方案的过程中,我发现在带有socket.io web应用程序的nodejs中,IIS中的web套接字必须被禁用,才能正确地转发到nodejs(IIS.net上的资源链接),所以我尝试了同样的方法,并得到了错误(一旦web.config中出现webSocket
元素就会发生):
试图确定承载应用程序的DNX进程的进程id时出错。
我的web.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" />
</handlers>
<httpPlatform processPath="%DNX_PATH%" arguments="%DNX_ARGS%" forwardWindowsAuthToken="false" stdoutLogEnabled="true" startupTimeLimit="3600" />
<staticContent>
<!-- A bunch of mime types (no difference if removed) -->
</staticContent>
<webSocket enabled="false" />
</system.webServer>
</configuration>
在这一点上,我没有什么想法了。我确保在windows功能中安装了WebSockets,并尝试在Azure上部署我的网站(打开了web套接字),完成后将托管在那里。
我想说的是,问题是网络套接字没有被转发到DNX,但找不到解决方案。任何帮助都将不胜感激。
更新
重新创建问题的解决方案。
问题出现在缺少包Microsoft.AspNet.WebSockets.Server
和调用startup.cs
app.UseWebSockets()
中。
这些问题在GitHub上得到了解决,这要归功于@davidowl。