2009-04-28 9 views
0

背景: ASP.NET 2.0を使用してWebサービスを作成中です。このWebサービスは、データベースから動的に取り込まれた選択ボックスを含む既存のWebフォームへの別のインタフェースを提供します。ASP.NET WebサービスでWSDL列挙を文字列にマッピングする

ウェブサービスの最初の草案は、それぞれの文字列を受け取り、それが有効であることを保証し、そうでない場合はエラーを返すようにしました。しかし、Webサービスのコンシューマは、可能な値が頻繁に変更される可能性は低いため、WSDLに列挙された値を提供することを頼んでいます。

Webサービスコードで列挙型を作成するのは嫌なので、代わりに生成されたWSDLファイルを変更し、クラスを検査する代わりにWebサービスで使用するようWebサービスに指示しました。

WSDL:

<?xml version="1.0" encoding="utf-8"?> 
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://example.org/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://example.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
    <wsdl:types> 
    <s:schema elementFormDefault="qualified" targetNamespace="http://example.org/"> 
     <s:element name="MyMethod"> 
     <s:complexType> 
      <s:sequence> 
      <s:element minOccurs="0" maxOccurs="1" name="myClass" type="tns:MyClass" /> 
      </s:sequence> 
     </s:complexType> 
     </s:element> 
     <s:complexType name="MyClass"> 
     <s:sequence> 
      <s:element minOccurs="0" maxOccurs="1" name="MyString" type="tns:MyStringPossibleValues" /> 
     </s:sequence> 
     </s:complexType> 
     <s:element name="MyMethodResponse"> 
     <s:complexType /> 
     </s:element> 
     <s:simpleType name="MyStringPossibleValues"> 
     <s:restriction base="s:string"> 
      <s:enumeration value="alpha" /> 
      <s:enumeration value="bravo" /> 
     </s:restriction> 
     </s:simpleType> 
    </s:schema> 
    </wsdl:types> 
    <wsdl:message name="MyMethodSoapIn"> 
    <wsdl:part name="parameters" element="tns:MyMethod" /> 
    </wsdl:message> 
    <wsdl:message name="MyMethodSoapOut"> 
    <wsdl:part name="parameters" element="tns:MyMethodResponse" /> 
    </wsdl:message> 
    <wsdl:portType name="ExternalAccessSoap"> 
    <wsdl:operation name="MyMethod"> 
     <wsdl:input message="tns:MyMethodSoapIn" /> 
     <wsdl:output message="tns:MyMethodSoapOut" /> 
    </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:portType name="ExternalAccessHttpGet" /> 
    <wsdl:portType name="ExternalAccessHttpPost" /> 
    <wsdl:binding name="ExternalAccessSoap" type="tns:ExternalAccessSoap"> 
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> 
    <wsdl:operation name="MyMethod"> 
     <soap:operation soapAction="http://example.org/MyMethod" style="document" /> 
     <wsdl:input> 
     <soap:body use="literal" /> 
     </wsdl:input> 
     <wsdl:output> 
     <soap:body use="literal" /> 
     </wsdl:output> 
    </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:binding name="ExternalAccessSoap12" type="tns:ExternalAccessSoap"> 
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" /> 
    <wsdl:operation name="MyMethod"> 
     <soap12:operation soapAction="http://example.org/MyMethod" style="document" /> 
     <wsdl:input> 
     <soap12:body use="literal" /> 
     </wsdl:input> 
     <wsdl:output> 
     <soap12:body use="literal" /> 
     </wsdl:output> 
    </wsdl:operation> 
    </wsdl:binding> 
</wsdl:definitions> 

Webサービス:

namespace Example.Service 
{ 
    [WebService(Namespace = "http://example.org/")] 
    [WebServiceBinding(
     ConformsTo = WsiProfiles.BasicProfile1_1, 
     Location="ExternalAccess.wsdl", 
     Name="ExternalAccessSoap", 
     Namespace = "http://example.org/")] 
    [ToolboxItem(false)] 
    public class ExternalAccess : System.Web.Services.WebService 
    { 
     public class MyClass 
     { 
      public string MyString; 
     } 

     [WebMethod] 
     [SoapDocumentMethod(
      Action = "http://example.org/MyMethod", 
      RequestNamespace = "http://example.org/", 
      Binding="ExternalAccessSoap")] 
     public void MyMethod(MyClass myClass) 
     { 
     } 
    } 
} 

問題: WSDLは、文字列MyStringの列挙を指定し、コードは、文字列型、ASPを指定されるように。 NETはフィールドを正しくマップすることはできません。

デシリアライザに文字列フィールドに列挙値を設定するよう指示する属性はありますか?

よろしく、

マット

私のためにこれを行うには石鹸の拡張機能を作成するプロセスを経た

答えて

1

私はMyStringが実際に自分のWebサービスに送信されていなかったことを発見しました。

これは、このサービスのテストアプリケーションが.NETで構築されていて、要求オブジェクトを構築するときに生成されたプロキシクラスのMyStringSpecifiedプロパティが見落とされたためです。これにより、列挙された値がSOAP要求の一部として送信されなくなりました。

このプロパティをtrueに設定すると、列挙値がWebサービスのMyStringフィールドに正常に割り当てられました。

関連する問題