Archives

Archives / 2005 / October
  • PhotoCritters.com

    I've launched the very first stage of my Photography Critiques community website, PhotoCritters.com.

    People that are interested can reserve their spot in the initial beta program, which is limited to 1,000 beta users.

    If you're interested in photography, please have a look.

    Cheers!


  • Possible Bug : HttpPost and class name conflicts

    A colleague and friend of mine run into some very odd web service behaviour on ASP.NET 1.1. Anyone who can shed some light on this, please leave a comment. I have pasted his exact text describing the problem below.

    --
    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; }
        }
    }