void ImportMessageParts() { SoapMethodStubInfo method = (SoapMethodStubInfo)MethodStubInfo; ImportMessage(method.InputMembersMapping, InputMessage); ImportMessage(method.OutputMembersMapping, OutputMessage); foreach (SoapHeaderMapping hf in method.Headers) { if (hf.Custom) { continue; } Message msg = new Message(); msg.Name = Operation.Name + hf.HeaderType.Name; MessagePart part = new MessagePart(); part.Name = hf.HeaderType.Name; msg.Parts.Add(part); ServiceDescription.Messages.Add(msg); if (method.Use == SoapBindingUse.Literal) { // MS.NET reflects header classes in a weird way. The root element // name is the CLR class name unless it is specified in an XmlRootAttribute. // The usual is to use the xml type name by default, but not in this case. XmlRootAttribute root; XmlAttributes ats = new XmlAttributes(hf.HeaderType); if (ats.XmlRoot != null) { root = ats.XmlRoot; } else { root = new XmlRootAttribute(hf.HeaderType.Name); } if (root.Namespace == null) { root.Namespace = TypeInfo.LogicalType.GetWebServiceLiteralNamespace(ServiceDescription.TargetNamespace); } if (root.ElementName == null) { root.ElementName = hf.HeaderType.Name; } XmlTypeMapping mapping = ReflectionImporter.ImportTypeMapping(hf.HeaderType, root); part.Element = new XmlQualifiedName(mapping.ElementName, mapping.Namespace); SchemaExporter.ExportTypeMapping(mapping); } else { XmlTypeMapping mapping = SoapReflectionImporter.ImportTypeMapping(hf.HeaderType, TypeInfo.LogicalType.GetWebServiceEncodedNamespace(ServiceDescription.TargetNamespace)); part.Type = new XmlQualifiedName(mapping.ElementName, mapping.Namespace); SoapSchemaExporter.ExportTypeMapping(mapping); } } }
protected override bool ReflectMethod() { LogicalTypeInfo ti = TypeStubManager.GetLogicalTypeInfo(ServiceType); HttpOperationBinding sob = new HttpOperationBinding(); sob.Location = "/" + MethodStubInfo.Name; OperationBinding.Extensions.Add(sob); if (!Method.IsVoid) { MimeXmlBinding mxb = new MimeXmlBinding(); mxb.Part = "Body"; OperationBinding.Output.Extensions.Add(mxb); MessagePart part = new MessagePart(); part.Name = "Body"; XmlTypeMapping map = ReflectionImporter.ImportTypeMapping(Method.ReturnType, ti.GetWebServiceLiteralNamespace(ServiceDescription.TargetNamespace)); XmlQualifiedName qname = new XmlQualifiedName(map.ElementName, map.Namespace); part.Element = qname; OutputMessage.Parts.Add(part); SchemaExporter.ExportTypeMapping(map); } XmlReflectionMember[] mems = new XmlReflectionMember [Method.Parameters.Length]; for (int n = 0; n < Method.Parameters.Length; n++) { ParameterInfo param = Method.Parameters [n]; XmlReflectionMember mem = new XmlReflectionMember(); mem.MemberName = param.Name; Type ptype = param.ParameterType; if (ptype.IsByRef) { ptype = ptype.GetElementType(); } mem.MemberType = ptype; mems [n] = mem; } XmlMembersMapping memap = ReflectionImporter.ImportMembersMapping("", ti.WebServiceAbstractNamespace, mems, false); bool allPrimitives = true; for (int n = 0; n < memap.Count; n++) { XmlMemberMapping mem = memap[n]; MessagePart part = new MessagePart(); XmlQualifiedName pqname; if (mem.TypeNamespace == "") { pqname = new XmlQualifiedName(mem.TypeName, XmlSchema.Namespace); } else { pqname = new XmlQualifiedName(mem.TypeName, mem.TypeNamespace); allPrimitives = false; } part.Type = pqname; part.Name = mem.ElementName; InputMessage.Parts.Add(part); } if (!allPrimitives) { SoapSchemaExporter.ExportMembersMapping(memap); } return(true); }