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 })); } }
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)); }