Exemplo n.º 1
0
        private HttpResponseObject TryExecuteHandler(HttpListenerContext context, string methodName)
        {
            try
            {
                var requestData = new Dictionary <string, string>();
                if (context.Request.HttpMethod == "POST")
                {
                    requestData = ReadPostData(context);
                }
                else if (context.Request.HttpMethod == "GET")
                {
                    var url = context.Request.Url.ToString();
                    if (url.Contains('?'))
                    {
                        var query = url.Substring(url.LastIndexOf('?') + 1);
                        foreach (var part in query.Split('&'))
                        {
                            if (string.IsNullOrWhiteSpace(part))
                            {
                                continue;
                            }

                            var keyValue = part.Split('=');
                            var key      = keyValue[0];
                            var value    = keyValue.Length > 1? keyValue[1]: "";
                            requestData.Add(key, value);
                        }
                    }
                }
                else
                {
                    throw new InvalidOperationException("Invalid Request: " + context.Request.HttpMethod);
                }

                return(ExecuteHandler(context.Request, methodName, requestData));
            }
            catch (Exception ex)
            {
                FireExceptionMessage(ex);
                return(HttpResponseObject.FromJson(new { Error = ex.Message }));
            }
        }
Exemplo n.º 2
0
        private HttpResponseObject ExecuteHandler(HttpListenerRequest request, string methodName, Dictionary <string, string> requestData)
        {
            if (!_delegationMap.ContainsKey(methodName))
            {
                return(HttpResponseObject.Empty);
            }

            // 검색의 편의를 위해 key를 모두 소문자로 변경한다.
            var data = requestData.ToDictionary(pair => pair.Key.ToLower(), pair => pair.Value);

            var delegator  = _delegationMap[methodName];
            var parameters = new List <object>();

            foreach (var param in delegator.Method.GetParameters())
            {
                var paramName = param.Name.ToLower();
                if (param.ParameterType == typeof(HttpListenerRequest))
                {
                    parameters.Add(request);
                }
                else if (param.ParameterType == typeof(CookieCollection))
                {
                    parameters.Add(request.Cookies);
                }
                else if (param.ParameterType == typeof(DataHttpSession))
                {
                    var session = FindDataSession(request.Cookies[DataSessionKeyCookieName].Value);
                    if (session == null && delegator.RedirectIfSessionIsNull)
                    {
                        return(HttpResponseObject.Redirect(RedirectUrlIfSessionIsNull));
                    }
                    parameters.Add(session);
                }
                else if (!data.ContainsKey(paramName))
                {
                    parameters.Add(param.ParameterType == typeof(string) ? "" : Activator.CreateInstance(param.ParameterType));
                }
                else
                {
                    // 잘못된 인자가 전달될 경우 예외가 발생할 수 있다.
                    parameters.Add(Convert.ChangeType(data[paramName], param.ParameterType));
                }
            }

            object returnObject;

            if (delegator.SynchronizeInstance && delegator.Instance != null)
            {
                // Lock 옵션을 사용한 경우에는 등록된 객체 전역에 lock을 걸고 method를 호출한다.
                lock (delegator.Instance)
                {
                    returnObject = delegator.Method.Invoke(delegator.Instance, parameters.ToArray());
                }
            }
            else
            {
                // 그 외의 경우에는 그냥 호출한다.
                returnObject = delegator.Method.Invoke(delegator.Instance, parameters.ToArray());
            }

            if (returnObject == null)
            {
                return(HttpResponseObject.Empty);
            }

            var returnObjectType = returnObject.GetType();

            if (returnObjectType == typeof(string))
            {
                return(HttpResponseObject.FromText(Convert.ToString(returnObject)));
            }

            if (returnObjectType == typeof(DataHttpSession))
            {
                return(HttpResponseObject.Empty.SetSession((DataHttpSession)returnObject));
            }

            if (returnObjectType == typeof(HttpResponseObject))
            {
                return((HttpResponseObject)returnObject);
            }

            return(HttpResponseObject.FromJson(returnObject));
        }