2016-01-28 7 views
5

サプライヤシステムからの要求をリッスンするWCFアプリケーションを作成しようとしています。サプライヤは私にWSDLを提供しているので、サービスを作成し、そのエンドポイントを公開する必要があります。WCFサービス+予期しないオブジェクト構造を生成するSvcUtil

私はSvcUtil.exeを使用してC#クラスを生成しましたが、むしろ奇妙な型を出力しています。

これが私に与えられた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:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
    <wsdl:types> 
    <s:schema elementFormDefault="qualified"> 
     <s:element name="Submit"> 
     <s:complexType> 
      <s:sequence> 
      <s:element minOccurs="0" maxOccurs="1" name="Incident"> 
       <s:complexType> 
       <s:sequence> 
        <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="TransactionId" type="s:string" /> 
        <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="TransactionType" type="s:string" /> 
        <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="TransactionSubType" type="s:string" /> 
        <s:element minOccurs="0" maxOccurs="unbounded" form="unqualified" name="ConfigurationItem"> 
        <s:complexType> 
         <s:sequence> 
         <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="AssetTag" type="s:string" /> 
         <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="Name" type="s:string" /> 
        .... 

私は実行するコマンドは、私は、これは、このような構造を作成することを期待するだけで

svcutil.exe file_name.wsdl 

です:

class Submit { ... } 
class Incident { ... } 
class ConfigurationItem { ... } 

シリアル化すると、次のようになります。

<Submit> 
    <Incident> 
     <TransactionId>12345</TransactionId> 
     <TransactionType>12345</TransactionType> 
     <TransactionSubType>12345</TransactionSubType> 
     <ConfigurationItem> 
      <AssetTag>xyz</AssetTag> 
      <Name>name</Name> 
     </ConfigurationItem> 
    </Incident> 
</Submit> 

しかし、SvcUtil.exeの出力は私に次のようになります:

class SubmitIncident { ... } 
class SubmitIncidentConfigurationItem { ... } 

それは提出束まで思われますし、インシデントを1つにオブジェクトを、また、それがそれぞれの上に「SubmitIncident」を付加しますネストされた要素シリアライズするときだから私はこれを取得:

<SubmitIncident> 
    <TransactionId>...</TransactionId> 
    <TransactionType>...</TransactionType> 
    <TransactionSubType>...</TransactionSubType> 
    <SubmitIncidentConfigurationItem> 
     <AssetTag>...</AssetTag> 
     <Name>...</Name> 
    </SubmitIncidentConfigurationItem> 
</SubmitIncident> 

これは、(彼らは私に話をすることはできませんので、私のサービスは彼らのWSDLと一致していません)サプライヤーの両方に問題が発生し、以降の処理で、私は、アプリケーションでやっています。誰も私がなぜこれが起こっているのか、それを止める方法、そしてSvcUtilが適切に出力されるのを理解するのを助けることができますか?

答えて

1

クラス定義と定義は実際には問題ではないことが判明しました(後で別の問題が発生しますが、何が起こっているかを理解すれば簡単に解決できます)。この問題は、使い捨て開発段階で行ったことに根ざしていました。

最初に私がしたのは、svcutil.exeを使用して、サプライヤからWSDLを使用してサーバークラスを生成することでした。いったんデバッグ/テストを開始すれば、当然私はWCFテストクライアントとVisual Studioに組み込まれている開発サーバーに向かいました。クライアントを使用するとき、それはあらゆる種類のあいまいなエラー、例えばHTTPSは、それらの多くは、設定の矛盾が非常にグーグルのビットで固定したなどの契約やバインディング、との問題をサポートしますが、エラーの中で、このありませんでした:これはSubmitIncidentの際にいずれかを起こった

The operation is not supported in the WCF Test Client because it uses type SubmitIncident

他のプロパティでネストされている場合でも、プロパティのタイプはobjectです。基本的には、一度に1つのエラーに取り組んでいました。 主にプロパティとクラスの属性を追加したり削除したりしていました。 DataMember、SoapAction、Namespaceなど

最終的に、WCFテストクライアントを使用してアプリケーション内のエンドポイントを正常に呼び出すことができました。しかし、それが通信している他のアプリケーションになると、それは元の質問に従って失敗していました。 WCFテストクライアントでそれを動作させるために私が行った変更は、実際に元のWSDLスキーマに対してこのサービスを無効にしました!

TL; DR;

WCFテストクライアントを使用してWCFアプリケーションをビルドしてテストしないでください。私は十分にこれを強調することはできません。通常の使用でアプリケーションが壊れる原因となるものを削除する必要があります。初期の開発段階からでもSoapUIのような業界標準アプリケーションを使用してください。

役立ちリンク

関連する問題