| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- //
- // System.Web.Services.Description.SoapProtocolReflector.cs
- //
- // Author:
- // Tim Coleman ([email protected])
- // Lluis Sanchez Gual ([email protected])
- //
- // Copyright (C) Tim Coleman, 2002
- //
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to
- // permit persons to whom the Software is furnished to do so, subject to
- // the following conditions:
- //
- // The above copyright notice and this permission notice shall be
- // included in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- //
- using System.Web.Services;
- using System.Web.Services.Protocols;
- using System.Xml.Serialization;
- using System.Xml.Schema;
- using System.Xml;
- namespace System.Web.Services.Description {
- internal class SoapProtocolReflector : ProtocolReflector
- {
- #region Fields
- internal const string EncodingNamespace = "http://schemas.xmlsoap.org/soap/encoding/";
- SoapBinding soapBinding;
- #endregion // Fields
- #region Constructors
- public SoapProtocolReflector ()
- {
- }
-
- #endregion // Constructors
- #region Properties
- public override string ProtocolName {
- get { return "Soap"; }
- }
- #endregion // Properties
- #region Methods
- protected override void BeginClass ()
- {
- SoapBinding sb = new SoapBinding ();
- sb.Transport = SoapBinding.HttpTransport;
- sb.Style = ((SoapTypeStubInfo)TypeInfo).SoapBindingStyle;
- Binding.Extensions.Add (sb);
- SoapAddressBinding abind = new SoapAddressBinding ();
- abind.Location = ServiceUrl;
- Port.Extensions.Add (abind);
- }
- protected override void EndClass ()
- {
- }
- protected override bool ReflectMethod ()
- {
- SoapOperationBinding sob = new SoapOperationBinding();
- SoapMethodStubInfo method = (SoapMethodStubInfo) MethodStubInfo;
-
- sob.SoapAction = method.Action;
- sob.Style = method.SoapBindingStyle;
- OperationBinding.Extensions.Add (sob);
-
- ImportMessage (method.InputMembersMapping, InputMessage);
- ImportMessage (method.OutputMembersMapping, OutputMessage);
-
- AddOperationMsgBindings (method, OperationBinding.Input);
- AddOperationMsgBindings (method, OperationBinding.Output);
- foreach (HeaderInfo hf in method.Headers)
- {
- if (hf.IsUnknownHeader) 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);
- SoapHeaderBinding hb = new SoapHeaderBinding ();
- hb.Message = new XmlQualifiedName (msg.Name, ServiceDescription.TargetNamespace);
- hb.Part = part.Name;
- hb.Use = method.Use;
-
- 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);
- hb.Encoding = EncodingNamespace;
- }
- if ((hf.Direction & SoapHeaderDirection.Out) != 0)
- OperationBinding.Output.Extensions.Add (hb);
- if ((hf.Direction & SoapHeaderDirection.In) != 0)
- OperationBinding.Input.Extensions.Add (hb);
- }
-
- return true;
- }
- void AddOperationMsgBindings (SoapMethodStubInfo method, MessageBinding msg)
- {
- SoapBodyBinding sbbo = new SoapBodyBinding();
- msg.Extensions.Add (sbbo);
- sbbo.Use = method.Use;
- if (method.Use == SoapBindingUse.Encoded)
- {
- sbbo.Namespace = ServiceDescription.TargetNamespace;
- sbbo.Encoding = EncodingNamespace;
- }
- }
-
- void ImportMessage (XmlMembersMapping members, Message msg)
- {
- SoapMethodStubInfo method = (SoapMethodStubInfo) MethodStubInfo;
- bool needsEnclosingElement = (method.ParameterStyle == SoapParameterStyle.Wrapped &&
- method.SoapBindingStyle == SoapBindingStyle.Document);
- if (needsEnclosingElement)
- {
- MessagePart part = new MessagePart ();
- part.Name = "parameters";
- XmlQualifiedName qname = new XmlQualifiedName (members.ElementName, members.Namespace);
- if (method.Use == SoapBindingUse.Literal) part.Element = qname;
- else part.Type = qname;
- msg.Parts.Add (part);
- }
- else
- {
- for (int n=0; n<members.Count; n++)
- {
- MessagePart part = new MessagePart ();
- part.Name = members[n].MemberName;
-
- if (method.Use == SoapBindingUse.Literal) {
- if (members[n].Any)
- part.Type = new XmlQualifiedName ("any", members[n].Namespace);
- else
- part.Element = new XmlQualifiedName (members[n].ElementName, members[n].Namespace);
- }
- else {
- string namesp = members[n].TypeNamespace;
- if (namesp == "") namesp = members[n].Namespace;
- part.Type = new XmlQualifiedName (members[n].TypeName, namesp);
- }
- msg.Parts.Add (part);
- }
- }
-
-
- if (method.Use == SoapBindingUse.Literal)
- SchemaExporter.ExportMembersMapping (members);
- else
- SoapSchemaExporter.ExportMembersMapping (members, needsEnclosingElement);
- }
- protected override string ReflectMethodBinding ()
- {
- return ((SoapMethodStubInfo)MethodStubInfo).Binding;
- }
- #endregion
- }
- }
|