Zmiana WebService w celu wygenerowania porządanego WSDLa.

0

Załóżmy że mam taki oto WebService napisany w C#:

   [WebService(Namespace = "http://tempuri.org/")]
   [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
   [System.ComponentModel.ToolboxItem(false)]
   // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
   // [System.Web.Script.Services.ScriptService]
   public class WebServiceTest : System.Web.Services.WebService
   {

      [WebMethod]
      public string HelloWorld(
         string abc, 
         string qwe,
         [XmlArray("fooArray")]
         [XmlArrayItem("item")]
         Foo[] fooArray)
      {
         return "Hello World";
      }
   }

   public class Foo
   {
      public string Bar { get; set; }
   }

Generuje on następujący WSDL:

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"...>
  <wsdl:types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
      <s:element name="HelloWorld">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="abc" type="s:string" />
            <s:element minOccurs="0" maxOccurs="1" name="qwe" type="s:string" />
            <s:element minOccurs="0" maxOccurs="1" name="fooArray" type="tns:ArrayOfFoo" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:complexType name="ArrayOfFoo">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="unbounded" name="item" nillable="true" type="tns:Foo" />
        </s:sequence>
      </s:complexType>
<!-- itd.. -->
    </s:schema>
  </wsdl:types>
</wsdl:definitions>

Co ja muszę dopisać w C# żeby ta linijka w WSDL:

      <s:complexType name="ArrayOfFoo">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="unbounded" name="item" nillable="true" type="tns:Foo" />
        </s:sequence>
      </s:complexType>

wyglądała następująco (zmiana z minOccurs z "0" na "1"):

      <s:complexType name="ArrayOfFoo">
        <s:sequence>
          <s:element minOccurs="1" maxOccurs="unbounded" name="item" nillable="true" type="tns:Foo" />
        </s:sequence>
      </s:complexType>

Jak w przypadku pojedynczych elementów to nie ma problemu tak tutaj wymiękam.

0

Może to Cię na coś naprowadzi http://stackoverflow.com/a/16971203 , choć obiecująco nie wygląda :)

0

Tak to działa okej ale nie przy tablicach jak dodam taki znacznik do Foo[] fooArray to wyleci cały Web Service. ;)
EDIT: Dodanie IsNullable = true do XmlArray oraz XmlArrayItem też nie pomaga. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1