public void RegisterService(ITypeFactory serviceFactoryFn, Type serviceType) { var processedReqs = new HashSet <Type>(); if (typeof(IService).IsAssignableFrom(serviceType) && !serviceType.IsAbstract && !serviceType.IsGenericTypeDefinition && !serviceType.ContainsGenericParameters) { foreach (var mi in serviceType.GetActions()) { var requestType = mi.GetParameters()[0].ParameterType; if (processedReqs.Contains(requestType)) { continue; } processedReqs.Add(requestType); RegisterServiceExecutor(requestType, serviceType, serviceFactoryFn); var returnMarker = requestType.GetTypeWithGenericTypeDefinitionOf(typeof(IReturn <>)); var responseType = returnMarker != null? returnMarker.GetGenericArguments()[0] : mi.ReturnType != typeof(object) && mi.ReturnType != typeof(void) ? mi.ReturnType : AssemblyUtils.FindType(requestType.FullName + ResponseDtoSuffix); RegisterRestPaths(requestType); appHost.Metadata.Add(serviceType, requestType, responseType); if (typeof(IRequiresRequestStream).IsAssignableFrom(requestType)) { this.RequestTypeFactoryMap[requestType] = req => { var restPath = req.GetRoute(); var request = RestHandler.CreateRequest(req, restPath, req.GetRequestParams(), requestType.CreateInstance()); var rawReq = (IRequiresRequestStream)request; rawReq.RequestStream = req.InputStream; return(rawReq); }; } Log.DebugFormat("Registering {0} service '{1}' with request '{2}'", (responseType != null ? "Reply" : "OneWay"), serviceType.GetOperationName(), requestType.GetOperationName()); } } }
public void RegisterService(Type serviceType) { var processedReqs = new HashSet <Type>(); var actions = ServiceExecGeneral.Reset(serviceType); var requiresRequestStreamTypeInfo = typeof(IRequiresRequestStream).GetTypeInfo(); var appHost = ServiceStackHost.Instance; foreach (var mi in serviceType.GetActions()) { var requestType = mi.GetParameters()[0].ParameterType; if (processedReqs.Contains(requestType)) { continue; } processedReqs.Add(requestType); ServiceExecGeneral.CreateServiceRunnersFor(requestType, actions); var returnMarker = requestType.GetTypeWithGenericTypeDefinitionOf(typeof(IReturn <>)); var responseType = returnMarker != null? GetGenericArguments(returnMarker)[0] : mi.ReturnType != typeof(object) && mi.ReturnType != typeof(void) ? mi.ReturnType : Type.GetType(requestType.FullName + "Response"); RegisterRestPaths(requestType); appHost.Metadata.Add(serviceType, requestType, responseType); if (requiresRequestStreamTypeInfo.IsAssignableFrom(requestType.GetTypeInfo())) { this.RequestTypeFactoryMap[requestType] = req => { var restPath = req.GetRoute(); var request = RestHandler.CreateRequest(req, restPath, req.GetRequestParams(), ServiceStackHost.Instance.CreateInstance(requestType)); var rawReq = (IRequiresRequestStream)request; rawReq.RequestStream = req.InputStream; return(rawReq); }; } } }
public void Can_deserialize_TestRequest_QueryStringSerializer_output() { // Setup using (new BasicAppHost(typeof (TestService).Assembly).Init()) { var restPath = new RestPath(typeof(TestRequest), "/service", "GET"); var restHandler = new RestHandler { RestPath = restPath }; var requestString = "ListOfA={ListOfB:[{Property:prop1},{Property:prop2}]}"; NameValueCollection queryString = HttpUtility.ParseQueryString(requestString); var httpReq = new MockHttpRequest("service", "GET", "application/json", "service", queryString, new MemoryStream(), new NameValueCollection()); var request2 = (TestRequest)restHandler.CreateRequest(httpReq, "service"); Assert.That(request2.ListOfA.Count, Is.EqualTo(1)); Assert.That(request2.ListOfA.First().ListOfB.Count, Is.EqualTo(2)); } }