static WebServiceData GetWebServiceData(ContractDescription contract) { WebServiceData serviceData = new WebServiceData(); //build method dictionary Dictionary <string, WebServiceMethodData> methodDataDictionary = new Dictionary <string, WebServiceMethodData>(); // set service type serviceData.Initialize(new WebServiceTypeData(XmlConvert.DecodeName(contract.Name), XmlConvert.DecodeName(contract.Namespace), contract.ContractType), methodDataDictionary); foreach (OperationDescription operation in contract.Operations) { Dictionary <string, WebServiceParameterData> parameterDataDictionary = new Dictionary <string, WebServiceParameterData>(); bool useHttpGet = operation.Behaviors.Find <WebGetAttribute>() != null; WebServiceMethodData methodData = new WebServiceMethodData(serviceData, XmlConvert.DecodeName(operation.Name), parameterDataDictionary, useHttpGet); // build parameter dictionary MessageDescription requestMessage = operation.Messages[0]; if (requestMessage != null) { int numMessageParts = requestMessage.Body.Parts.Count; for (int p = 0; p < numMessageParts; p++) { MessagePartDescription messagePart = requestMessage.Body.Parts[p]; // DevDiv 129964:JS proxy generation fails for a WCF service that uses an untyped message // Message or its derived class are special, used for untyped operation contracts. // As per the WCF team proxy generated for them should treat Message equivalent to Object type. Type paramType = ReplaceMessageWithObject(messagePart.Type); WebServiceParameterData parameterData = new WebServiceParameterData(XmlConvert.DecodeName(messagePart.Name), paramType, p); parameterDataDictionary[parameterData.ParameterName] = parameterData; serviceData.ProcessClientType(paramType, false, true); } } if (operation.Messages.Count > 1) { // its a two way operation, get type information from return message MessageDescription responseMessage = operation.Messages[1]; if (responseMessage != null) { if (responseMessage.Body.ReturnValue != null && responseMessage.Body.ReturnValue.Type != null) { // operation has a return type, add type to list of type proxy to generate serviceData.ProcessClientType(ReplaceMessageWithObject(responseMessage.Body.ReturnValue.Type), false, true); } } } //add known types at operation level for (int t = 0; t < operation.KnownTypes.Count; t++) { serviceData.ProcessClientType(operation.KnownTypes[t], false, true); } methodDataDictionary[methodData.MethodName] = methodData; } serviceData.ClearProcessedTypes(); return(serviceData); }
private void OnPostAcquireRequestState(object sender, EventArgs eventArgs) { HttpApplication app = (HttpApplication)sender; HttpRequest request = app.Context.Request; if (app.Context.Handler is Page && RestHandlerFactory.IsRestMethodCall(request)) { // Get the data about the web service being invoked WebServiceData webServiceData = WebServiceData.GetWebServiceData(HttpContext.Current, request.FilePath, false, true); // Get the method name string methodName = request.PathInfo.Substring(1); // Get the data about the specific method being called WebServiceMethodData methodData = webServiceData.GetMethodData(methodName); RestHandler.ExecuteWebServiceCall(HttpContext.Current, methodData); // Skip the rest of the page lifecycle app.CompleteRequest(); } }