Web套接字Asp Net MVC Web API不能在Cloud Windows Server上运行,但可以在本地IIS上正常运行

问题描述

我创建了Asp.net Web api,用作Web套接字服务器。发布后,一切正常在我的本地IIS上运行良好,并且在调试时它可以响应所有客户端。

我已在Windows Server 2016 IIS和Windows Server 2019上部署了Windows XP,但是这些服务器的本地环境无法正常运行。 我也为此启用了网络套接功能

API消耗Bloomberg b管Api,并使用从Bloomberg接收到的实时流值将其共振到所有连接的客户端。

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
            }

        }
    }
}

这是我的web.config文件

<?xml version="1.0"?>
<!--
  For more @R_513_4045@ion 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,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>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)