Sockets Web套接字Asp。Net MVC Web API在云Windows服务器上不工作,但在本地IIS上工作正常
我创建了Asp.net web api,该api用作web套接字服务器。发布后,我的本地IIS上的一切都正常工作,并且在调试时,它会响应所有客户端 我已经在windows server 2016 IIS和windows server 2019上进行了部署,但对于这些服务器的本地环境来说,它不起作用。 我还为这些应用程序启用了web套接字功能 API使用彭博b管道API,并使用从彭博收到的实时流媒体值将其转发给所有连接的客户端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
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=\"Web\" /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} `;
控制台日志(消息);
});
}());