Ver Fonte

* Methods.cs: Added information about headers in MethodStubInfo. Added cache of serializers
in TypeStubInfo so serializers for headers they can be shared by several methods.
* SoapClientMessage.cs: Headers added in the constructor.
* SoapMessage.cs: Added header list initialization.
* SoapHttpClientProtocol.cs: Added support soap headers.

svn path=/trunk/mcs/; revision=15382

Lluis Sanchez há 22 anos atrás
pai
commit
5fbb899cb0

+ 8 - 0
mcs/class/System.Web.Services/System.Web.Services.Protocols/ChangeLog

@@ -1,3 +1,11 @@
+2003-06-14  Lluis Sanchez Gual  <[email protected]>
+
+	* Methods.cs: Added information about headers in MethodStubInfo. Added cache of serializers
+	  in TypeStubInfo so serializers for headers they can be shared by several methods.
+	* SoapClientMessage.cs: Headers added in the constructor.
+	* SoapMessage.cs: Added header list initialization.
+	* SoapHttpClientProtocol.cs: Added support soap headers.
+
 2003-06-13  Lluis Sanchez Gual  <[email protected]>
 
 	* Methods.cs: Added serializer to MethodStubInfo for deserializing faults.

+ 39 - 15
mcs/class/System.Web.Services/System.Web.Services.Protocols/Methods.cs

@@ -46,7 +46,7 @@ namespace System.Web.Services.Protocols {
 		internal XmlSerializer RequestSerializer;
 		internal XmlSerializer ResponseSerializer;
 
-		static XmlSerializer _faultSerializer;
+		internal HeaderInfo[] Headers;
 
 		//
 		// Constructor
@@ -148,7 +148,17 @@ namespace System.Web.Services.Protocols {
 				}
 				throw;
 			}
-//			ResponseSerializer.UnknownNode += new XmlNodeEventHandler (e);
+
+			o = source.GetCustomAttributes (typeof (SoapHeaderAttribute));
+			Headers = new HeaderInfo[o.Length];
+			for (int i = 0; i < o.Length; i++) {
+				SoapHeaderAttribute att = (SoapHeaderAttribute) o[i];
+				MemberInfo[] mems = source.DeclaringType.GetMember (att.MemberName);
+				if (mems.Length == 0) throw new InvalidOperationException ("Member " + att.MemberName + " not found in class " + source.DeclaringType.FullName);
+				
+				Type headerType = (mems[0] is FieldInfo) ? ((FieldInfo)mems[0]).FieldType : ((PropertyInfo)mems[0]).PropertyType;
+				Headers [i] = new HeaderInfo (parent.GetCommonSerializer (headerType), mems[0], att);
+			}
 		}
 
 		static internal MethodStubInfo Create (TypeStubInfo parent, LogicalMethodInfo lmi, XmlReflectionImporter xmlImporter, SoapReflectionImporter soapImporter)
@@ -228,23 +238,25 @@ namespace System.Web.Services.Protocols {
 			}
 			return out_members;
 		}
+	}
 
-		public XmlSerializer FaultSerializer
+	internal class HeaderInfo
+	{
+		internal XmlSerializer Serializer;
+		internal MemberInfo Member;
+		internal SoapHeaderAttribute AttributeInfo;
+
+		public HeaderInfo (XmlSerializer serializer, MemberInfo member, SoapHeaderAttribute attributeInfo)
 		{
-			get
-			{
-				if (_faultSerializer != null) return _faultSerializer;
-				_faultSerializer = new XmlSerializer (typeof(Fault));
-				return _faultSerializer;
-			}
+			Serializer = serializer;
+			Member = member;
+			AttributeInfo = attributeInfo;
 		}
-
-		static void e (object o, XmlNodeEventArgs a)
+		
+		public object GetHeaderValue (object ob)
 		{
-			Console.WriteLine ("Unexpected Node: {5}:{6} {0}/{1}/{2}/{3}/{4}",
-					   a.LocalName, a.Name, a.NamespaceURI, a.NodeType, a.Text,
-					   a.LineNumber, a.LinePosition);
-//			throw new Exception ();
+			if (Member is PropertyInfo) return ((PropertyInfo)Member).GetValue (ob, null);
+			else return ((FieldInfo)Member).GetValue (ob);
 		}
 	}
 
@@ -262,6 +274,7 @@ namespace System.Web.Services.Protocols {
 	//
 	internal class TypeStubInfo {
 		Hashtable name_to_method = new Hashtable ();
+		Hashtable common_serializers = new Hashtable ();
 
 		// Precomputed
 		internal SoapParameterStyle      ParameterStyle;
@@ -272,6 +285,7 @@ namespace System.Web.Services.Protocols {
 		internal string                  BindingLocation;
 		internal string                  BindingName;
 		internal string                  BindingNamespace;
+		internal XmlSerializer           FaultSerializer;
 
 		void GetTypeAttributes (Type t)
 		{
@@ -317,6 +331,7 @@ namespace System.Web.Services.Protocols {
 					Use = SoapBindingUse.Literal;
 				}
 			}
+			FaultSerializer = GetCommonSerializer (typeof(Fault));
 		}
 
 		//
@@ -350,6 +365,15 @@ namespace System.Web.Services.Protocols {
 		{
 			return (MethodStubInfo) name_to_method [name];
 		}
+
+		internal XmlSerializer GetCommonSerializer (Type type)
+		{
+			XmlSerializer s = (XmlSerializer) common_serializers [type];
+			if (s != null) return s;
+			s = new XmlSerializer (type);
+			common_serializers [type] = s;
+			return s;
+		}
 	}
 	
 	//

+ 6 - 0
mcs/class/System.Web.Services/System.Web.Services.Protocols/SoapClientMessage.cs

@@ -40,6 +40,12 @@ namespace System.Web.Services.Protocols {
 			this.client_method = client_method;
 			this.url = url;
 			Parameters = parameters;
+
+			foreach (HeaderInfo hi in msi.Headers) {
+				SoapHeader headerVal = hi.GetHeaderValue (client) as SoapHeader;
+				if (headerVal != null)
+					Headers.Add (headerVal);
+			}
 		}
 
 		#endregion 

+ 11 - 4
mcs/class/System.Web.Services/System.Web.Services.Protocols/SoapHttpClientProtocol.cs

@@ -76,15 +76,22 @@ namespace System.Web.Services.Protocols {
 		
 		const string soap_envelope = "http://schemas.xmlsoap.org/soap/envelope/";
 		
-		void WriteSoapEnvelope (XmlTextWriter xtw)
+		void WriteSoapEnvelope (XmlTextWriter xtw, SoapHeaderCollection headers)
 		{
 			xtw.WriteStartDocument ();
 			
 			xtw.WriteStartElement ("soap", "Envelope", soap_envelope);
 			xtw.WriteAttributeString ("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
 			xtw.WriteAttributeString ("xmlns", "xsd", null, "http://www.w3.org/2001/XMLSchema");
+
+   			foreach (SoapHeader header in headers) {
+   				XmlSerializer ser = type_info.GetCommonSerializer (header.GetType());
+       			xtw.WriteStartElement ("soap", "Header", soap_envelope);
+   				ser.Serialize (xtw, header);
+       			xtw.WriteEndElement ();
+   			}
 		}
-		
+
 		void SendRequest (WebRequest request, SoapClientMessage message)
 		{
 			WebHeaderCollection headers = request.Headers;
@@ -99,7 +106,7 @@ namespace System.Web.Services.Protocols {
 				
 				XmlTextWriter xtw = new XmlTextWriter (s, new UTF8Encoding (false));
 				xtw.Formatting = Formatting.Indented;
-				WriteSoapEnvelope (xtw);
+				WriteSoapEnvelope (xtw, message.Headers);
 				xtw.WriteStartElement ("soap", "Body", soap_envelope);
 
 				// Serialize arguments.
@@ -175,7 +182,7 @@ namespace System.Web.Services.Protocols {
 			}
 			else
 			{
-				Fault fault = (Fault) msi.FaultSerializer.Deserialize (xml_reader);
+				Fault fault = (Fault) type_info.FaultSerializer.Deserialize (xml_reader);
 				throw new SoapException (fault.faultstring, fault.faultcode, fault.faultactor, fault.detail);
 			}
 		}

+ 1 - 1
mcs/class/System.Web.Services/System.Web.Services.Protocols/SoapMessage.cs

@@ -20,7 +20,7 @@ namespace System.Web.Services.Protocols {
 
 		string content_type = "text/xml";
 		SoapException exception = null;
-		SoapHeaderCollection headers = null;
+		SoapHeaderCollection headers = new SoapHeaderCollection ();
 		SoapMessageStage stage;
 		Stream stream;