[Mono-list] Fwd: XmlIgnore attribute ignored in SOAP client requests in mono 3.2.1
Dave Curylo
curylod at asme.org
Tue Oct 1 19:33:09 UTC 2013
I'm migrating projects from running under mono 2.10.8.1 up to mono
3.2.1, and I've come upon an issue where it appears that the
[XmlIgnore] attribute is no longer preventing the SOAP request from
sending some properties. When I test it directly in the
XmlSerializer, it works as expected (ignoring things marked with
XmlIgnore), but when making SOAP requests, they are passed along.
I’m have a sample solution of simple web service and a console client
that illustrates the issue of XmlIgnore attribute ignoring in proxy
class, but it seems to be too large to attach with the WSDL and
generated proxy (25 KB). I'll describe it...
SampleWebService (declared in Test.WebService project) is a ASP.NET
web service that exposes one web method:
[WebMethod]
public string SampleMethod(string name, int age,
[System.Xml.Serialization.XmlIgnoreAttribute()] bool ageSpecified) {
…
}
The service XSD is such:
<s:schema elementFormDefault="qualified"
targetNamespace="http://sample.webservice.org/">
<s:element name="SampleMethod">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="name"
type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="age" type="s:int" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="SampleMethodResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1"
name="SampleMethodResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
</s:schema>
A key thing here is the parameter “age” of type “int” that is optional.
The proxy generated with wsdl.exe tool contains method:
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://sample.webservice.org/SampleMethod",
RequestNamespace="http://sample.webservice.org/",
ResponseNamespace="http://sample.webservice.org/",
Use=System.Web.Services.Description.SoapBindingUse.Literal,
ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public string SampleMethod(string name, int age,
[System.Xml.Serialization.XmlIgnoreAttribute()] bool ageSpecified) {
object[] results = this.Invoke("SampleMethod", new object[] {
name,
age,
ageSpecified});
return ((string)(results[0]));
}
The Test.WebService.Client is a simple console application that is
calling SampleWebService:
static void Main() {
try {
var proxy = new SampleWebService { Url =
ConfigurationManager.ConnectionStrings["SampleWebService"].ConnectionString
};
var result = proxy.SampleMethod("Test", 0, false);
Console.WriteLine(result);
}
catch (Exception ex) {
Console.WriteLine(ex.ToString());
}
Console.WriteLine("Press <enter> to exit...");
Console.ReadLine();
}
This app running on Windows .NET or Mono 2.10.8 generates the
following SOAP envelope:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<SampleMethod
xmlns="http://sample.webservice.org/">
<name>Test</name>
</SampleMethod>
</soap:Body>
</soap:Envelope>
When running on Mono 3.2.1/3.2.0 the SOAP envelope contains an extra
element “ageSpecified”:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<SampleMethod
xmlns="http://sample.webservice.org/">
<name>Test</name>
<ageSpecified>false</ageSpecified>
</SampleMethod>
</soap:Body>
</soap:Envelope>
It looks like Mono 3 has ignored the presence of XmlIgnore attribute
in proxy class for “ageSpecified” parameter when generating the SOAP
envelope. Such SOAP message format is a problem for web services that
contain request validation against XSD.
Is this a known issue or is there a workaround or option so it will
behave as in previous mono versions?
More information about the Mono-list
mailing list