public IWebSocketExecutionHandler GetExecutionHandler(HttpServerAssemblyContainer container) { var typeDefinition = container.RegisteredTypes.Values.OfType <WebSocketTypeDefinition>() .FirstOrDefault(x => string.Equals(x.ServiceName, ServiceName, StringComparison.OrdinalIgnoreCase)); if (typeDefinition == null) { throw new Exception(string.Format("websocket '{0}' cannot be found.", ServiceName)); } return(DependencyInjector.GetObject(typeDefinition.Info as Type) as IWebSocketExecutionHandler); }
public void Execute(HttpServerAssemblyContainer container) { var typeDefinition = container.RegisteredTypes.Values.OfType <RestServiceTypeDefinition>() .FirstOrDefault(x => string.Equals(x.ServiceName, Request.ServiceName, StringComparison.OrdinalIgnoreCase)); if (typeDefinition == null) { throw new Exception(string.Format("service '{0}' cannot be found.", Request.ServiceName)); } RestServiceInstanceMethodInfo methodInfo = null; if (Request.MethodName.HasValue()) { if (Request.Request.HttpMethod == "GET") { methodInfo = typeDefinition.InstanceMethods.OfType <RestServiceInstanceMethodInfo>() .FirstOrDefault(x => x.HttpVerb == HttpVerb.Get && string.Equals(x.ServiceMethodName, Request.MethodName, StringComparison.OrdinalIgnoreCase)); } else { methodInfo = typeDefinition.InstanceMethods.OfType <RestServiceInstanceMethodInfo>() .FirstOrDefault(x => x.HttpVerb == HttpVerb.Post && string.Equals(x.ServiceMethodName, Request.MethodName, StringComparison.OrdinalIgnoreCase)); } } else { if (Request.Request.HttpMethod == "GET") { methodInfo = typeDefinition.InstanceMethods.OfType <RestServiceInstanceMethodInfo>() .FirstOrDefault(x => x.HttpVerb == HttpVerb.Get && x.IsDefaultMethod); } else { methodInfo = typeDefinition.InstanceMethods.OfType <RestServiceInstanceMethodInfo>() .FirstOrDefault(x => x.HttpVerb == HttpVerb.Post && x.IsDefaultMethod); } } if (methodInfo == null) { throw new Exception(string.Format("method '{0}' cannot be found.", Request.MethodName)); } var obj = DependencyInjector.GetObject(typeDefinition.Info as Type); if (obj == null) { throw new Exception(string.Format("failed to create object '{0}'.", (typeDefinition.Info as Type).FullName)); } object returnValue = null; if (Request.Request.HttpMethod == "GET") { if (methodInfo.ParameterInfos == null || methodInfo.ParameterInfos.Length == 0) { returnValue = methodInfo.Invoke(obj, null); } else { var dict = Request.ReadQueryString(); var values = new string[methodInfo.ParameterInfos.Length]; for (var i = 0; i < values.Length; i++) { var parameterInfo = methodInfo.ParameterInfos.OfType <RestServiceParameterInfo>().FirstOrDefault(x => x.Index == i); var name = parameterInfo.Alias.HasValue() ? parameterInfo.Alias : parameterInfo.ParameterName; if (!dict.Keys.ToArray().Exists(x => string.Equals(x, name, StringComparison.OrdinalIgnoreCase))) { throw new Exception(string.Format("parameter '{0}' does not exist.", name)); } values[i] = dict.FirstOrDefault(x => string.Equals(x.Key, name, StringComparison.OrdinalIgnoreCase)).Value; } returnValue = methodInfo.Invoke(obj, values); } } else { if (methodInfo.ParameterInfos == null) { throw new Exception(string.Format("method '{0}' must have more than one parameter.", methodInfo.MethodName)); } else if (methodInfo.ParameterInfos.Length == 1) { returnValue = methodInfo.Invoke(obj, Request.ReadInputStream(methodInfo.ParameterInfos[0].TypeDefinition.Info as Type, methodInfo.RequestDataFormat)); } else // > 1 { var dict = Request.ReadQueryString(); var values = new object[methodInfo.ParameterInfos.Length]; for (var i = 0; i < values.Length; i++) { var parameterInfo = methodInfo.ParameterInfos.OfType <RestServiceParameterInfo>().FirstOrDefault(x => x.Index == i); if (parameterInfo.Source == ParameterSource.Body) { values[i] = Request.ReadInputStream(parameterInfo.TypeDefinition.Info as Type, methodInfo.RequestDataFormat); } else if (parameterInfo.Source == ParameterSource.QueryString) { var name = parameterInfo.Alias.HasValue() ? parameterInfo.Alias : parameterInfo.ParameterName; if (!dict.Keys.ToArray().Exists(x => string.Equals(x, name, StringComparison.OrdinalIgnoreCase))) { throw new Exception(string.Format("parameter '{0}' does not exist.", name)); } values[i] = dict.FirstOrDefault(x => string.Equals(x.Key, name, StringComparison.OrdinalIgnoreCase)).Value; } else { throw new Exception(string.Format("method '{0}' parameters must specify attribute.", methodInfo.MethodName)); } } returnValue = methodInfo.Invoke(obj, values); } } if (returnValue != null) { Response.Write(returnValue, methodInfo.ResponseDataFormat); } }