Ejemplo n.º 1
0
        /// <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());
                }
            }
        }