瀏覽代碼

2006-11-22 Atsushi Enomoto <[email protected]>

	* SoapHeader.cs WebServiceHelper.cs SoapClientMessage.cs
	  HttpSoapWebServiceHandler.cs SoapHttpClientProtocol.cs:
	  SOAP 1.2 Envelope support has started. Though I will have to
	  change its internals significantly, so it is in my branch.


svn path=/branches/atsushi/mcs/; revision=68325
Atsushi Eno 19 年之前
父節點
當前提交
f474d5fedd

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

@@ -1,3 +1,10 @@
+2006-11-22  Atsushi Enomoto  <[email protected]>
+
+	* SoapHeader.cs WebServiceHelper.cs SoapClientMessage.cs
+	  HttpSoapWebServiceHandler.cs SoapHttpClientProtocol.cs:
+	  SOAP 1.2 Envelope support has started. Though I will have to
+	  change its internals significantly, so it is in my branch.
+
 2006-11-21  Atsushi Enomoto  <[email protected]>
 
 	* WebClientProtocol.cs HttpWebClientProtocol.cs SoapException.cs

+ 10 - 4
mcs/class/System.Web.Services/System.Web.Services.Protocols/HttpSoapWebServiceHandler.cs

@@ -287,13 +287,19 @@ namespace System.Web.Services.Protocols
 				}
 				
 				XmlTextWriter xtw = WebServiceHelper.CreateXmlWriter (outStream);
-				
+
+#if NET_2_0
+				bool soap12 = message.SoapVersion == SoapProtocolVersion.Soap12;
+#else
+				bool soap12 = false;
+#endif
+
 				if (message.Exception == null)
-					WebServiceHelper.WriteSoapMessage (xtw, methodInfo, SoapHeaderDirection.Out, message.OutParameters, message.Headers);
+					WebServiceHelper.WriteSoapMessage (xtw, methodInfo, SoapHeaderDirection.Out, message.OutParameters, message.Headers, soap12);
 				else if (methodInfo != null)
-					WebServiceHelper.WriteSoapMessage (xtw, methodInfo, SoapHeaderDirection.Fault, new Fault (message.Exception), message.Headers);
+					WebServiceHelper.WriteSoapMessage (xtw, methodInfo, SoapHeaderDirection.Fault, new Fault (message.Exception), message.Headers, soap12);
 				else
-					WebServiceHelper.WriteSoapMessage (xtw, SoapBindingUse.Literal, Fault.Serializer, null, new Fault (message.Exception), null);
+					WebServiceHelper.WriteSoapMessage (xtw, SoapBindingUse.Literal, Fault.Serializer, null, new Fault (message.Exception), null, soap12);
 
 				if (bufferResponse)
 				{

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

@@ -86,10 +86,9 @@ namespace System.Web.Services.Protocols {
 		}
 		
 #if NET_2_0
-		[MonoTODO]
 		[System.Runtime.InteropServices.ComVisible(false)]
 		public override SoapProtocolVersion SoapVersion {
-			get { throw new NotImplementedException (); }
+			get { return client.SoapVersion; }
 		}
 #endif
 

+ 7 - 2
mcs/class/System.Web.Services/System.Web.Services.Protocols/SoapHeader.cs

@@ -61,9 +61,14 @@ namespace System.Web.Services.Protocols {
 
 		internal SoapHeader (XmlElement elem)
 		{
-			actor = elem.GetAttribute ("actor", "http://schemas.xmlsoap.org/soap/envelope/");
-			string me = elem.GetAttribute ("mustUnderstand", "http://schemas.xmlsoap.org/soap/envelope/");
+			actor = elem.GetAttribute ("actor", WebServiceHelper.SoapEnvelopeNamespace);
+			string me = elem.GetAttribute ("mustUnderstand", WebServiceHelper.SoapEnvelopeNamespace);
 			if (me != "") EncodedMustUnderstand = me;
+#if NET_2_0
+			role = elem.GetAttribute ("role", WebServiceHelper.Soap12EnvelopeNamespace);
+			me = elem.GetAttribute ("mustUnderstand", WebServiceHelper.Soap12EnvelopeNamespace);
+			if (me != "") EncodedMustUnderstand12 = me;
+#endif
 		}
 
 		#endregion // Constructors

+ 6 - 2
mcs/class/System.Web.Services/System.Web.Services.Protocols/SoapHttpClientProtocol.cs

@@ -218,8 +218,12 @@ namespace System.Web.Services.Protocols
 				}
 
 				XmlTextWriter xtw = WebServiceHelper.CreateXmlWriter (s);
-				
-				WebServiceHelper.WriteSoapMessage (xtw, message.MethodStubInfo, SoapHeaderDirection.In, message.Parameters, message.Headers);
+#if NET_2_0
+				bool soap12 = message.SoapVersion == SoapProtocolVersion.Soap12;
+#else
+				bool soap12 = false;
+#endif
+				WebServiceHelper.WriteSoapMessage (xtw, message.MethodStubInfo, SoapHeaderDirection.In, message.Parameters, message.Headers, soap12);
 
 				if (extensions != null) {
 					message.SetStage (SoapMessageStage.AfterSerialize);

+ 39 - 20
mcs/class/System.Web.Services/System.Web.Services.Protocols/WebServiceHelper.cs

@@ -42,6 +42,9 @@ namespace System.Web.Services.Protocols
 	internal class WebServiceHelper
 	{
 		public const string SoapEnvelopeNamespace = "http://schemas.xmlsoap.org/soap/envelope/";
+		public const string Soap12EnvelopeNamespace = "http://www.w3.org/2003/05/soap-envelope";
+		public const string SoapEncodingNamespace = "http://schemas.xmlsoap.org/soap/encoding/";
+		public const string Soap12EncodingNamespace = "http://www.w3.org/2003/05/soap-encoding";
 		static readonly char [] trimChars = { '"', '\'' };
 		static readonly bool prettyXml;
 		
@@ -99,35 +102,41 @@ namespace System.Web.Services.Protocols
 			return Encoding.GetEncoding (encoding);
 		}
 
-		public static void WriteSoapMessage (XmlTextWriter xtw, SoapMethodStubInfo method, SoapHeaderDirection dir, object bodyContent, SoapHeaderCollection headers)
+		public static void WriteSoapMessage (XmlTextWriter xtw, SoapMethodStubInfo method, SoapHeaderDirection dir, object bodyContent, SoapHeaderCollection headers, bool soap12)
 		{
 			SoapBindingUse methodUse = dir == SoapHeaderDirection.Fault ? SoapBindingUse.Literal : method.Use;
 			XmlSerializer bodySerializer = method.GetBodySerializer (dir);
 			XmlSerializer headerSerializer = method.GetHeaderSerializer (dir);
 			object[] headerArray = method.GetHeaderValueArray (dir, headers);
-			WriteSoapMessage (xtw, methodUse, bodySerializer, headerSerializer, bodyContent, headerArray);
+			WriteSoapMessage (xtw, methodUse, bodySerializer, headerSerializer, bodyContent, headerArray, soap12);
 		}
 		
-		public static void WriteSoapMessage (XmlTextWriter xtw, SoapBindingUse methodUse, XmlSerializer bodySerializer, XmlSerializer headerSerializer, object bodyContent, object[] headers)
+		public static void WriteSoapMessage (XmlTextWriter xtw, SoapBindingUse methodUse, XmlSerializer bodySerializer, XmlSerializer headerSerializer, object bodyContent, object[] headers, bool soap12)
 		{
+			string ns = soap12 ?
+				WebServiceHelper.Soap12EnvelopeNamespace :
+				WebServiceHelper.SoapEnvelopeNamespace;
+			string encNS = soap12 ?
+				WebServiceHelper.Soap12EncodingNamespace :
+				WebServiceHelper.SoapEncodingNamespace;
 			xtw.WriteStartDocument ();
-			xtw.WriteStartElement ("soap", "Envelope", WebServiceHelper.SoapEnvelopeNamespace);
+			xtw.WriteStartElement ("soap", "Envelope", ns);
 			xtw.WriteAttributeString ("xmlns", "xsi", null, XmlSchema.InstanceNamespace);
 			xtw.WriteAttributeString ("xmlns", "xsd", null, XmlSchema.Namespace);
 
 			// Serialize headers
 			if (headers != null)
 			{
-				xtw.WriteStartElement ("soap", "Header", WebServiceHelper.SoapEnvelopeNamespace);
+				xtw.WriteStartElement ("soap", "Header", ns);
 				headerSerializer.Serialize (xtw, headers);
 				xtw.WriteEndElement ();
 			}
 
 			// Serialize body
-			xtw.WriteStartElement ("soap", "Body", WebServiceHelper.SoapEnvelopeNamespace);
+			xtw.WriteStartElement ("soap", "Body", ns);
 			
 			if (methodUse == SoapBindingUse.Encoded)
-				xtw.WriteAttributeString ("encodingStyle", WebServiceHelper.SoapEnvelopeNamespace, "http://schemas.xmlsoap.org/soap/encoding/");
+				xtw.WriteAttributeString ("encodingStyle", ns, encNS);
 				
 			bodySerializer.Serialize (xtw, bodyContent);
 
@@ -145,28 +154,38 @@ namespace System.Web.Services.Protocols
 		
 		public static void ReadSoapMessage (XmlTextReader xmlReader, XmlSerializer bodySerializer, XmlSerializer headerSerializer, out object body, out SoapHeaderCollection headers)
 		{
-			xmlReader.MoveToContent ();
-			xmlReader.ReadStartElement ("Envelope", WebServiceHelper.SoapEnvelopeNamespace);
-
-			headers = ReadHeaders (xmlReader, headerSerializer);
-
-			xmlReader.MoveToContent ();
-			xmlReader.ReadStartElement ("Body", WebServiceHelper.SoapEnvelopeNamespace);
+			xmlReader.MoveToContent ();
+			string ns = xmlReader.NamespaceURI;
+			switch (ns) {
+#if NET_2_0
+			case WebServiceHelper.Soap12EnvelopeNamespace:
+#endif
+			case WebServiceHelper.SoapEnvelopeNamespace:
+				break;
+			default:
+				throw new SoapException (String.Format ("SOAP version mismatch. Namespace '{0}' is not supported in this runtime profile.", ns), SoapException.VersionMismatchFaultCode);
+			}
+			xmlReader.ReadStartElement ("Envelope", ns);
+
+			headers = ReadHeaders (xmlReader, headerSerializer, ns);
+
+			xmlReader.MoveToContent ();
+			xmlReader.ReadStartElement ("Body", ns);
 			xmlReader.MoveToContent ();
 			
-			if (xmlReader.LocalName == "Fault" && xmlReader.NamespaceURI == SoapEnvelopeNamespace)
+			if (xmlReader.LocalName == "Fault" && xmlReader.NamespaceURI == ns)
 				bodySerializer = Fault.Serializer;
-
-			body = bodySerializer.Deserialize (xmlReader);
+
+			body = bodySerializer.Deserialize (xmlReader);
 		}
 
-		static SoapHeaderCollection ReadHeaders (XmlTextReader xmlReader, XmlSerializer headerSerializer)
+		static SoapHeaderCollection ReadHeaders (XmlTextReader xmlReader, XmlSerializer headerSerializer, string ns)
 		{
 			SoapHeaderCollection headers = null;
-			while (! (xmlReader.NodeType == XmlNodeType.Element && xmlReader.LocalName == "Body" && xmlReader.NamespaceURI == WebServiceHelper.SoapEnvelopeNamespace))
+			while (! (xmlReader.NodeType == XmlNodeType.Element && xmlReader.LocalName == "Body" && xmlReader.NamespaceURI == ns))
 			{
 				if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.LocalName == "Header" 
-				    && xmlReader.NamespaceURI == WebServiceHelper.SoapEnvelopeNamespace && !xmlReader.IsEmptyElement
+				    && xmlReader.NamespaceURI == ns && !xmlReader.IsEmptyElement
 				    && headerSerializer != null)
 				{
 					xmlReader.ReadStartElement ();