2011-07-17 16 views
0

私のクライアントは、実装する必要のあるWebサービスの契約としてWSDLファイルを指定しています。 (これは実際には他のパートナなどと通信しているため、WSDLファイルでなければなりません。また、WSDLファイルに基づいて独自のWebサービスとクライアントを実装します)。WSDL.exeは往復しませんか?

wsdl.exeを使用して、サーバー側のプロキシクラスを作成しました。だから私はWebサービスを実装することができます。 しかし、元のWSDLファイルに基づいてクライアントサイドプロキシクラスを作成するためにwsdl.exeを使用すると、Webアプリケーションと通信できないクライアントアプリケーションになります。

INSTEAD:WebサービスのURLに "?wsdl"を追加すると、別のWSDLファイルが取得されます。その2番目のWSDLファイルを使用してクライアント側プロキシクラスを作成すると、Webアプリケーションと完全に通信できるクライアントアプリケーションになります。不思議なことに、2番目のWSDLファイルのサイズは、元のWSDLファイルの63 KBではなく、288 KBです。

WSDLが往復でないことを意味するはずです(WSDLファイル→wsdl.exeを使用してサーバーサイドプロキシクラスを作成 - > Webサービス - > "wsdl"をWebサービスURLに追加 - >元のものとは別のWSDLファイル(さらに悪い:それらは互換性がありません))

誰でもこれを説明できますか? (私のプロジェクトでは、他の当事者が元のWSDLファイルを利用するため、Webサービスと通信できなくなるため、重要です...)

私はC#とCLI 。再現性があります。 IIS 7.5と.NET Framework 3.5を使用しています。

+1

コマンドラインの設定と、生成されたCとSが一致しないサンプルを投稿する方が良い。ファイルサイズの比較は無意味です。 –

答えて

0

私のコードウィザード(Visual Studio 2008のCLI ASP.NET Webサービス用に自由に利用できるテンプレートで、標準のC#Webサービステンプレートは同じ種類のコードを生成します)によって生成されたコードを少し修正した後、

// MyWebService.cpp : main project file. 
#include "stdafx.h" 
#include "Global.asax.h" 
#include "HeaderFileGeneratedByWsdlExe.h" 

using namespace System; 
using namespace System::Web; 
using namespace System::Web::Services; 

namespace MyWebService { 

    [WebService(Namespace = L"http://MyNamespace.org/")] 
    [WebServiceBinding(ConformsTo = WsiProfiles::BasicProfile1_1)] 
    public ref class MyWebService : public System::Web::Services::WebService 
    { 
    public: 

     [WebMethod(Description = L"myMethod does something")] 
     System::Void myMethod(MyClass ^myInstance) 
     { 
      DoSth(myInstance); 
     } 
    }; 
} 

「HeaderFileGeneratedByWsdlExe.hは」私は「serverInterface」モードを指定して、(指定されたWSDLファイルに基づいて)wsdl.exeで生成されたヘッダファイルはもちろんである:そのような何かを得ました。 (そのヘッダーファイル 'MyClass'が定義されています) この時点で、Webサービスを正しく構築して実行することができます。私は自分のWebサービスのwsdlファイルを「発見」し、クライアント側のプロキシクラスを生成し、Webサービスと正しく通信できるクライアントアプリケーションを実装できます。残念ながら、元のWSDLファイルを使用してクライアントサイドプロキシクラスを生成した場合でも、クライアントアプリケーションはMyClassインスタンスをWebサービスに送信できますが、WebサービスはそのMyClassインスタンスを直列化できませんでした。次のように

コードを変更する必要があります。

// MyWebService.cpp : main project file. 
#include "stdafx.h" 
#include "Global.asax.h" 
#include "HeaderFileGeneratedByWsdlExe.h" 

using namespace System; 
using namespace System::Web; 
using namespace System::Web::Services; 

namespace MyWebService { 

    [WebService(Namespace = L"http://MyNamespace.org/")] 
    public ref class MyWebService : public InterfaceFromHeaderFile 
    { 
    public: 

     System::Void myMethod(MyClass ^myInstance) 
     { 
      DoSth(myInstance); 
     } 
    }; 
} 

変更は、次のとおり - 私はWebServiceBinding属性を除去します。 - 「WebService」からではなく、生成されたヘッダファイル内のabstractサーバ側プロキシクラスからクラスを推測しました。 - WebMethod属性を削除しました。

これらの変更後、すべてが正常に機能しています。

2

元のWSDLは、一部のスタブを生成するためだけに使用されます。 ?wsdlをサービスアドレスに追加すると、WSDLドキュメントを取得するようにサービスが指示されますが、デフォルトでは独自のWSDLドキュメントが作成されます。元の文書を強制的に返却したい場合はmodify your serviceでなければなりません。

同じWSDLから生成されたクライアントとサービスが互いに話せない場合は、別のWSDLが提供されていてはるかに大きな問題があります。その部分では、WSDLがわからないとほとんどあなたを助けません。

+0

あなたは正しいです。クライアントとサービスが通信できなかったことが大きな問題でした。しかし、とにかくあなたのリンクに感謝[http://www.pluralsight-training.net/community/blogs/craig/archive/2005/12/15/17482.aspx](http://www.pluralsight-training.net/コミュニティ/ブログ/ craig/archive/2005/12/15/17482.aspx)。より良いウェブサービスを理解し、コミュニケーションの問題の本当の原因を見つけることは、私にとって多くの助けとなりました。 –

関連する問題