Possible Bug : HttpPost and class name conflicts
--
Included below is a minimal web-service implementation to recreate a problem
I've encountered in a web service that has methods returning classes with the
same local name (but in different namespaces).
If only the SoapHttp protocol is enabled in the web.config, everything works
as expected - with the different "Something" classes being serialized in to
different XML namespaces as defined by the ResponseNamespace property of the
SoapDocumentMethod attributes.
However - if HttpPost or HttpPostLocalhost are enabled (the latter being
enabled by default), and I browse to the asmx file in IE, I get this error :
Types NsProblem.B.Something and NsProblem.A.Something both use the XML type
name, Something, from namespace http://example/NsProblem/. Use XML attributes
to specify a unique XML name and/or namespace for the type.
If I un-comment both of the "XmlRoot" elements I get this error
The XML element named 'Something' from namespace 'http://example/NsProblem/'
references distinct types NsProblem.A.Something and NsProblem.B.Something.
Use XML attributes to specify another XML name or namespace for the element
or types.
Now for the really strange bit : leave one XmlRoot attribute commented, and
the other not, and it works!
When it is working, the example responses (on whatever.asmx?op=GetArrayA)
don't appear to tbe any difference!
(aside: I also tried setting the responses to be different using Xml
Serialization attributes, i.e. putting [return: XmlElement(... )] on the
methods, but like the SoapDocumentMethod attribute this only seemed to change
the response for the Soap method - making no difference to the HTTP POST
response)
Various workarounds are available
- disable (remove) "HttpPost" and "HttpPostLocalhost" in web.config
- Rename the classes (making the namespaces redundant)
but I would prefer to be able to keep the class names as they are, and keep
the HttpPostLocalhost enabled for testing / debugging purposes - and I
anticipate needing to support 3 or more classes with the same local-name
across different namespaces.
---- Minimal test case ----
<%@ WebService Language="c#" Class="NsProblem.XmlTestSvc" %>
using System;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Serialization;
namespace NsProblem.A
{
// [XmlRoot(Namespace="AAAA")]
public class Something { }
}
namespace NsProblem.B
{
// [XmlRoot(Namespace="BBBB")]
public class Something { }
}
namespace NsProblem
{
[WebService(Description="Conflicting name problem example",
Namespace="http://example/NsProblem/")]
public class XmlTestSvc : System.Web.Services.WebService
{
[WebMethod]
[SoapDocumentMethod(ResponseNamespace="http://example/NsProblem/A")]
public NsProblem.A.Something[] GetArrayA() { return null; }
[WebMethod]
[SoapDocumentMethod(ResponseNamespace="http://example/NsProblem/B")]
public NsProblem.B.Something[] GetArrayB() { return null; }
}
}