Bladeren bron

2010-03-26 Atsushi Enomoto <[email protected]>

	* MessageFault.cs : Write Subcode element correctly and fix wrong
	  Code/Value/Subcode element relationship. Give better error message.


svn path=/trunk/mcs/; revision=154279
Atsushi Eno 15 jaren geleden
bovenliggende
commit
71bbae3e58

+ 5 - 0
mcs/class/System.ServiceModel/System.ServiceModel.Channels/ChangeLog

@@ -1,3 +1,8 @@
+2010-03-26  Atsushi Enomoto  <[email protected]>
+
+	* MessageFault.cs : Write Subcode element correctly and fix wrong
+	  Code/Value/Subcode element relationship. Give better error message.
+
 2010-03-26  Atsushi Enomoto  <[email protected]>
 
 	* HttpRequestChannel.cs : ok, no need for conditional code path.

+ 8 - 8
mcs/class/System.ServiceModel/System.ServiceModel.Channels/MessageFault.cs

@@ -161,7 +161,7 @@ namespace System.ServiceModel.Channels
 					value = (XmlQualifiedName) r.ReadElementContentAs (typeof (XmlQualifiedName), r as IXmlNamespaceResolver, "Value", ns);
 					break;
 				default:
-					throw new ArgumentException ();
+					throw new ArgumentException (String.Format ("Unexpected Fault Code subelement: '{0}'", r.LocalName));
 				}
 				r.MoveToContent ();
 			}
@@ -351,7 +351,7 @@ namespace System.ServiceModel.Channels
 			EnvelopeVersion version)
 		{
 			writer.WriteStartElement ("Fault", version.Namespace);
-			WriteFaultCode (writer, version, Code);
+			WriteFaultCode (writer, version, Code, false);
 			WriteReason (writer, version);
 			if (HasDetail)
 				OnWriteDetail (writer, version);
@@ -359,23 +359,23 @@ namespace System.ServiceModel.Channels
 		}
 
 		private void WriteFaultCode (XmlDictionaryWriter writer, 
-			EnvelopeVersion version, FaultCode code)
+			EnvelopeVersion version, FaultCode code, bool sub)
 		{
 			if (version == EnvelopeVersion.Soap11) {
 				writer.WriteStartElement ("", "faultcode", String.Empty);
-				if (code.Namespace.Length > 0)
+				if (code.Namespace.Length > 0 && String.IsNullOrEmpty (writer.LookupPrefix (code.Namespace)))
 					writer.WriteXmlnsAttribute ("a", code.Namespace);
 				writer.WriteQualifiedName (code.Name, code.Namespace);
 				writer.WriteEndElement ();
 			} else { // Soap12
-				writer.WriteStartElement ("Code", version.Namespace);
+				writer.WriteStartElement (sub ? "Subcode" : "Code", version.Namespace);
 				writer.WriteStartElement ("Value", version.Namespace);
-				if (code.Namespace.Length > 0)
+				if (code.Namespace.Length > 0 && String.IsNullOrEmpty (writer.LookupPrefix (code.Namespace)))
 					writer.WriteXmlnsAttribute ("a", code.Namespace);
 				writer.WriteQualifiedName (code.Name, code.Namespace);
-				if (code.SubCode != null)
-					WriteFaultCode (writer, version, code.SubCode);
 				writer.WriteEndElement ();
+				if (code.SubCode != null)
+					WriteFaultCode (writer, version, code.SubCode, true);
 				writer.WriteEndElement ();
 			}
 		}