asp.Netmvcはapiによりwebsocket通信を実現する
8568 ワード
この例に従ってwebsocket通信を実装する場合は、iisが8.0バージョン以上であることを確認する必要があります.低バージョンではこの実装はサポートされていないようです.
APIコントローラMessageSendControllerを作成します.コントローラの下でGETメソッドを作成してwebsocketの初期化を実現し、フロントエンドアクセス時発がwebsockcetアクセスif(HttpContext.Current.IsWebSocketRequest)であると判断し、HttpContextを初期化する.Current.AcceptWebSocketRequest(Websockets); Websocketsメソッドを作成して、メッセージの受信と送信を実現します.具体的なコードは、次のです.
APIコントローラMessageSendControllerを作成します.コントローラの下でGETメソッドを作成してwebsocketの初期化を実現し、フロントエンドアクセス時発がwebsockcetアクセスif(HttpContext.Current.IsWebSocketRequest)であると判断し、HttpContextを初期化する.Current.AcceptWebSocketRequest(Websockets); Websocketsメソッドを作成して、メッセージの受信と送信を実現します.具体的なコードは、次のです.
public static List.socketMod> Listws = new List();
private async Task Websockets(AspNetWebSocketContext arg)
{
var web = arg.WebSocket;
while (true)
{
//ArraySegment ,
ArraySegment buffer = new ArraySegment(new byte[1024]);
//
WebSocketReceiveResult result = await web.ReceiveAsync(buffer, CancellationToken.None);
//
if (web.State == WebSocketState.Open)
{
string message = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);
// , ,
if(message.Contains(" "))
{
var id = message.Split('|').LastOrDefault()?.ObjTolong();
var mesd = Listws.FirstOrDefault(p => p.userid == id);
mesd.isstop = true;
}
// , , socketMod , , id , , CallContext( ) , 。
if (message.ObjTolong() > 0&&!Listws.Exists(p=>p.userid==message.ObjTolong()))
{
var md=new Models.socketMod();
md.SecWebSocketKey = arg.SecWebSocketKey;
md.userid = message.ObjTolong();
md.webst = web;
Listws.Add(md);
}
var mes = new BLL.mescontent();
mes.jdt = "0";
mes.mess = " :" + DateTime.Now.ToLongTimeString();
buffer = new ArraySegment(Encoding.UTF8.GetBytes(mes.MToString()));
// , Listws
await web.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
} else
{
if (Listws.Exists(p=>p.SecWebSocketKey==arg.SecWebSocketKey))
{
Listws.Remove(Listws.FirstOrDefault(p=>p.SecWebSocketKey.Equals(arg.SecWebSocketKey)));
SessionHelper.SetCach("websockect", Listws);
}
break;
}
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 4、フロントエンドコードの var ws;
var $msg = $("#msged");
var $jdt = $("#jindut");
$(function() {
connec();
});
function connec()
{
// websocket
ws = new WebSocket("ws://" + window.location.hostname + ":" + window.location.port + "/api/MessageSend");
ws.onopen = function () {
$msg.html(" ");
send();
}
ws.onmessage = function (msg) {
var md = $.parseJSON(msg.data);
$msg.html(md.mess);
$jdt.css("width", md.jdt + "%");
$jdt.attr("aria-valuenow", md.jdt);
}
ws.onerror = function (err) {
$msg.html(err);
}
ws.onclose = function () {
$msg.html(" ");
}
}
//
function send() {
// alert(ws.readyState);
if (ws.readyState === WebSocket.OPEN) {
ws.send('@SessionHelper.GetSession(MeSession.UserManageID)');
} else {
$msg.html(" ");
}
}