[Mono-bugs] [Bug 52228][Blo] New - Generated WSDL is not fully compatible with Visual Studio 2003

bugzilla-daemon@bugzilla.ximian.com bugzilla-daemon@bugzilla.ximian.com
Tue, 16 Dec 2003 07:46:20 -0500 (EST)

Please do not reply to this email- if you want to comment on the bug, go to the
URL shown below and enter your comments there.

Changed by mordechait@mainsoft.com.


--- shadow/52228	2003-12-16 07:46:19.000000000 -0500
+++ shadow/52228.tmp.1842	2003-12-16 07:46:19.000000000 -0500
@@ -0,0 +1,79 @@
+Bug#: 52228
+Product: Mono/Class Libraries
+Version: unspecified
+OS: All
+OS Details: 
+Status: NEW   
+Priority: Blocker
+Component: System.XML
+AssignedTo: mono-bugs@ximian.com                            
+ReportedBy: mordechait@mainsoft.com               
+QAContact: mono-bugs@ximian.com
+TargetMilestone: ---
+Summary: Generated WSDL is not fully compatible with Visual Studio 2003
+Description of Problem:
+When a web method returns some valuetype (for example DataTime) the Mono
+WSDL generator describes that type attribute as maxoccurs=1 and minoccurs=0
+. When VS2003 builds a client proxy for such WSDL it interpatate it as
+return void ! 
+if only the minoccurs would raise to 1 , everything could work in Micorsoft
+client and in XSP server too.
+Steps to reproduce the problem:
+1. write a simple web service that returns the current date.
+2. Open Visual Studio 2003 and write a client that consumes that service
+   (use Add Web Reference to reference the service in step 1)
+Actual Results:
+The web method signature in the client returns void.
+Expected Results:
+The web method signature in the client should returns DateTime.
+How often does this happen? 
+Additional Information:
+This bug doesn't reflected in Mono XSP server. The service works OK there.
+I guess Mono's XSP understands the WSDL differently then Microsoft.
+The bug is in :
+ System.Xml.Serialization.XmlSchemaExporter.cs line 316  method:
+"if (isTypeMember)
+	{
+	selem.MaxOccurs = 1;
+	selem.MinOccurs = einfo.IsNullable ? 1 : 0;
+	if ((einfo.TypeData.Type.IsPrimitive && einfo.TypeData.Type !=
+typeof(string)) || einfo.TypeData.Type.IsEnum || encodedFormat) 
+	selem.MinOccurs = 1;
+check "if (einfo.TypeD..." condition .
+The condition in words: if the element is primitive but not a String or if
+it is an Enum or in encoded format set the selem.MinOccurs to 1.
+For some unknown reason it doesn't evaluate to True even if the type
+is a primitive and not a string. I suspect the the typeof operator...
+The if parts must be evaluated in advance.
+The Fix:
+bool isPrimitive = einfo.IsPrimitive;
+bool isString = einfo.TypeData.Type == typeof(string);
+bool isEnum = einfo.TypeData.Type.IsEnum;
+if ((isPrimitive && !isString) || isEnum || encodedFormat) 
+    selem.MinOccurs = 1;
+This has been tested and works.