Sockets Web套接字Asp。Net MVC Web API在云Windows服务器上不工作,但在本地IIS上工作正常

Sockets Web套接字Asp。Net MVC Web API在云Windows服务器上不工作,但在本地IIS上工作正常,sockets,asp.net-web-api,websocket,windows-server-2016,socketserver,Sockets,Asp.net Web Api,Websocket,Windows Server 2016,Socketserver,我创建了Asp.net web api,该api用作web套接字服务器。发布后,我的本地IIS上的一切都正常工作,并且在调试时,它会响应所有客户端 我已经在windows server 2016 IIS和windows server 2019上进行了部署,但对于这些服务器的本地环境来说,它不起作用。 我还为这些应用程序启用了web套接字功能 API使用彭博b管道API,并使用从彭博收到的实时流媒体值将其转发给所有连接的客户端 using System; using System.Collecti

我创建了Asp.net web api,该api用作web套接字服务器。发布后,我的本地IIS上的一切都正常工作,并且在调试时,它会响应所有客户端

我已经在windows server 2016 IIS和windows server 2019上进行了部署,但对于这些服务器的本地环境来说,它不起作用。 我还为这些应用程序启用了web套接字功能

API使用彭博b管道API,并使用从彭博收到的实时流媒体值将其转发给所有连接的客户端

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.WebSockets;
using System.Net.Http;
using System.Web.Http;
using System.Web;
using System.Web.WebSockets;
using System.Threading.Tasks;
using System.Threading;
using System.Text;
using System.Globalization;
using Bloomberglp.Blpapi;
using BloombergAPI.BloombergHelper;

namespace BloombergAPI.Controllers
{
    public class ValuesController : ApiController
    {
        // GET api/values
        [HttpGet]
        public HttpResponseMessage Get()
        {
            var status = HttpStatusCode.BadRequest;
            var context = HttpContext.Current;
            if (context.IsWebSocketRequest)
            {
                context.AcceptWebSocketRequest(ProcessRequest);
                status = HttpStatusCode.SwitchingProtocols;

            }

            return new HttpResponseMessage(status);
        }

        private async Task ProcessRequest(AspNetWebSocketContext context)
        {
            var ws = context.WebSocket;
            await Task.WhenAll(WriteTask(ws), ReadTask(ws));
        }

        // MUST read if we want the socket state to be updated
        private async Task ReadTask(WebSocket ws)
        {
            var buffer = new ArraySegment<byte>(new byte[1024]);
            while (true)
            {
                await ws.ReceiveAsync(buffer, CancellationToken.None).ConfigureAwait(false);
                if (ws.State != WebSocketState.Open) break;
            }
        }

        private async Task WriteTask(WebSocket ws)
        {
            try
            {
                API_Caller.Main(ws);
            }
            catch (Exception ex)
            {
                var buffer1 = Encoding.UTF8.GetBytes(ex.Message);
                if (ws.State == WebSocketState.Open)
                   await ws.SendAsync(new ArraySegment<byte>(buffer1), WebSocketMessageType.Text, true, CancellationToken.None);

                await Task.Delay(1000).ConfigureAwait(false); // this is NOT ideal
            }

        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
Net系统;
使用System.Net.WebSockets;
使用System.Net.Http;
使用System.Web.Http;
使用System.Web;
使用System.Web.WebSockets;
使用System.Threading.Tasks;
使用系统线程;
使用系统文本;
利用制度全球化;
使用Bloombergglp.Blpapi;
使用Bloomberggapi.bloombergghelper;
名称空间BloombergAPI.Controllers
{
公共类值控制器:ApiController
{
//获取api/值
[HttpGet]
公共HttpResponseMessage Get()
{
var status=HttpStatusCode.BadRequest;
var context=HttpContext.Current;
if(context.IsWebSocketRequest)
{
AcceptWebSocketRequest(ProcessRequest);
状态=HttpStatusCode.SwitchingProtocols;
}
返回新的HttpResponseMessage(状态);
}
专用异步任务ProcessRequest(AspNetWebSocketContext上下文)
{
var ws=context.WebSocket;
wait Task.WhenAll(WriteTask(ws)、ReadTask(ws));
}
//如果希望更新套接字状态,则必须读取
专用异步任务ReadTask(WebSocket ws)
{
var buffer=newarraysegment(新字节[1024]);
while(true)
{
wait ws.ReceiveAsync(缓冲区,CancellationToken.None);
如果(ws.State!=WebSocketState.Open)中断;
}
}
专用异步任务写任务(WebSocket ws)
{
尝试
{
API_Caller.Main(ws);
}
捕获(例外情况除外)
{
var buffer1=Encoding.UTF8.GetBytes(例如Message);
if(ws.State==WebSocketState.Open)
等待ws.SendAsync(新的ArraySegment(buffer1)、WebSocketMessageType.Text、true、CancellationToken.None);
等待任务。延迟(1000)。配置等待(false);//这不理想
}
}
}
}
这是我的web.config文件

<?xml version="1.0"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  https://go.microsoft.com/fwlink/?LinkId=301879
  -->
<configuration>
  <appSettings>
    <add key="webpages:Version" value="3.0.0.0"/>
    <add key="webpages:Enabled" value="false"/>
    <add key="ClientValidationEnabled" value="true"/>
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/>

      <add key="Instruments_list" value="BBHBEAT index,BBG0013HGRV5" />
  
  </appSettings>
  <!--
    For a description of web.config changes see http://go.microsoft.com/fwlink/?LinkId=235367.

    The following attributes can be set on the <httpRuntime> tag.
      <system.Web>
        <httpRuntime targetFramework="4.6" />
      </system.Web>
  -->
  <system.web>
    <compilation debug="true" targetFramework="4.6"/>
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.webServer>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
      <remove name="OPTIONSVerbHandler"/>
      <remove name="TRACEVerbHandler"/>
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/>
    </handlers>
  </system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Antlr3.Runtime" publicKeyToken="eb42632606e9261f"/>
        <bindingRedirect oldVersion="0.0.0.0-3.5.0.2" newVersion="3.5.0.2"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed"/>
        <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-1.6.5135.21930" newVersion="1.6.5135.21930"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-5.2.7.0" newVersion="5.2.7.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
  </system.codedom>
</configuration>

客户端代码在本地IIS和visual studio上运行良好

@{ 
    Layout = null;
}
<html>

<head>
    <meta name="viewport" content="width=device-width" />
    <title>Page</title>
</head>

<body>
    <h1>Stream to me</h1>
    <ul id="StreamToMe"></ul>

    <script>
        (function() {
            var getWebSocketMessages = function(onMessageReceived) {
                var url = `ws://path:port/api/values`;
                console.log('url is: ' + url);

                var webSocket = new WebSocket(url);

                webSocket.onmessage = onMessageReceived;
            };

            var ulElement = document.getElementById('StreamToMe');
            
                getWebSocketMessages(function(message) {
                    ulElement.innerHTML = ulElement.innerHTML += `<li>${message.data}</li>`;
                    console.log(message);
                });
           
        }());
    </script>
</body>

</html>
@{
布局=空;
}
页
流向我
    (功能(){ var getWebSocketMessages=函数(onMessageReceived){ var url=`ws://path:port/api/values`; log('url为:'+url); var webSocket=新的webSocket(url); webSocket.onmessage=onMessageReceived; }; var ulement=document.getElementById('StreamToMe'); getWebSocketMessages(函数(消息){ ulElement.innerHTML=ulElement.innerHTML+=`
  • ${message.data}
  • `; 控制台日志(消息); }); }());