/// <summary> /// リクエスト処理部分 /// </summary> /// <param name="listenerContext"></param> private async void ProcessRequest(HttpListenerContext listenerContext) { using (WebSocket ws = (await listenerContext.AcceptWebSocketAsync(subProtocol: null)).WebSocket) { try { ArraySegment <byte> initBuff = new ArraySegment <byte>(new byte[1024]); WebSocketReceiveResult ret = await ws.ReceiveAsync(initBuff, CancellationToken.None); if (ret.MessageType == WebSocketMessageType.Text) { string initMessage = Encoding.UTF8.GetString(initBuff.Take(ret.Count).ToArray()); /* * 文字列からTypeに変換する処理のメモ。※今後このコードを使う可能性は低いけれど、メモとして残しておきます。 * Type type = Assembly.GetExecutingAssembly().GetTypes(). * FirstOrDefault(x => x.BaseType == typeof(SessionBase) && x.Name == initMessage); */ WebSocketParam.SessionCount++; InitInfo info = JsonConvert.DeserializeObject <InitInfo>(Encoding.UTF8.GetString(initBuff.Take(ret.Count).ToArray())); if (info.Type != null) { SessionBase session = Activator.CreateInstance(info.Type) as SessionBase; session.WS = ws; await session.Init(info); if (session.Enabled) { await session.Receive(); _logger.Debug("Session End."); if (!string.IsNullOrEmpty(session.Remark)) { _logger.Info(session.Remark); } } else { _logger.Error("Skip: session disable."); if (!string.IsNullOrEmpty(session.Remark)) { _logger.Info(session.Remark); } } } else { _logger.Error("Type Mismatch. [{0}]", initMessage); } WebSocketParam.SessionCount--; } } catch (Exception e) { _logger.Error(e.ToString()); } } }