Пример #1
0
        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);
        }