Ureader.com  
Microsoft software help and Community
   home   |   control panel login   |   archive   |  
 
XML
data.xmlanalysis
mappoint.webservice
msf
msxml-webrelease
netmyservices.sdk
passport.sdk
soap
soapsdk
uddi.general
uddi.programming
uddi.specification
xml
xmlsqlwebrelease
xsl
  
 
date: Wed, 21 Nov 2007 03:41:01 -0800,    group: microsoft.public.xml.soap        back       


adding namespaces to XmlSerializer when deserializing (C#, SOAP)   
Hi there
I'm hoping there's an easy answer to a (hopefully) not too long-winded 
issue...
I'm building a C# web client using a proxy wsdl.exe'd from a wsdl file and 
six schemas, each in a different namespace. Some schemas extend complex types 
in others. When i get a soap:Fault from my test server it could contain a 
serialized exception object (called fault) from one of two of these schemas 
(and different namespaces, call them xmlns:b0="ns1" and xmlns:eb="ns2"), yet 
the root element of the SoapException.Detail node will remain the same (in 
"ns1"). The prefix declaration is in the soap:Fault node of the response.

Now, if the object i'm trying to desrialize is defined in the same schema as 
the root element <b0:faultResp> (e.g. <b0:fault xsi:type="b0:ThisEx">) i 
create an XmlSerializer with this default namespace and it deserializes no 
problem, and the root element of the Detail node becomes <b0:faultResp 
xmlns:b0="ns1">. If it's defined in the other schema (e.g. <b0:fault 
xsi:type="eb:ThatEx">). i get an error: "Namespace prefix 'eb' is not 
declared", yet both prefixes are defined in the <soap:Fault xmlns:b0="ns1" 
xmlns:eb="ns2"> node

I understand that XmlSerializer.Serialize method takes an XmlNamespaces 
parameter which allows you to add any other namespaces it needs when 
serializing, but XmlSerializer.Desrialize doesn't; i can't find any way to at 
all. SoapFormatter.deserialize didn't work nor did using XmlSerializerFactory 
to create the serializer. So my questions then:

1. Is there some way to specify additional namespaces (like that  
xmlns:eb="ns2" guy) to the XmlSerializer object before deserializing?
2. Is there a way to extract the namespace declarations in the soap:Fault 
node from the SoapException the webmethod catches?
3. Is there a way of doing this without worrying about the namespaces at all?

The Fiddler'd response looks like this:
<?xml version="1.0"?>
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
	<Body>
		<soap:Fault xmlns:b0="ns1" xmlns:eb="ns2" 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
		<faultcode xmlns="">soap:Server</faultcode>
		<faultstring xmlns="">An exception was thrown on the server/faultstring>
			<detail xmlns="">
				<b0:faultResp>
					<b0:fault xsi:type="eb:ThatEx">
						<b0:desc>That other exception occurred</b0:desc>
					</b0:fault>
				</b0:faultResp>
			</detail>
		</soap:Fault>
	</Body>
</Envelope>


Excerpt from schema 1 (xmlns:b0="ns1")

<element name="faultResp" type="i0:FaultResp">
	<annotation>
		<documentation>A fault.</documentation>
	</annotation>
</element>
<complexType name="faultResp">
	<annotation>
		<documentation>A fault.</documentation>
	</annotation>
	<complexContent>
		<extension base="i0:BaseResp">
			<sequence>
				<element minOccurs="1" maxOccurs="1" name="fault" type="i0:Fault"/>
			</sequence>
		</extension>
	</complexContent>
</complexType>
...
<complexType name="Fault" abstract="true">
	<annotation>
		<documentation>A generic fault.</documentation>
	</annotation>
	<sequence>
		<element minOccurs="1" maxOccurs="1" name="desc" type="i0:Msg">
			<annotation>
				<documentation>description of the fault</documentation>
			</annotation>
		</element>
	</sequence>
</complexType>

Excerpt from schema 2 (xmlns:eb="ns2")

<complexType name="ThatEx">
	<annotation>
		<documentation>That Other exception.</documentation> 
	</annotation> 	
	<complexContent>
		<extension base="b0:Fault" />
	</complexContent>
</complexType>

What I'm looking for is to deserialize the <b0:faultResp> into an object of 
type FaultResp, with a property of type ThatEx, that has a string property 
called desc.

Any help appreciated.
Dave
date: Wed, 21 Nov 2007 03:41:01 -0800   author:   Radiodave

Google
 
Web ureader.com


    COPYRIGHT 2007, YARDI TECHNOLOGY LIMITED, ALL RIGHT RESERVE  |   contact us