web-dev-qa-db-ja.com

wsdlからc#クラスを生成する

ASP.NET Core 2.1でwsdl urlからC#クラスを生成します。

WSDLのURLは: https://airarabia.isaaviations.com/webservices/services/AAResWebServices?wsdl

「Microsoft WCF Webサービス参照プロバイダー」ツールを使用してC#クラスを生成すると、次のエラーが発生しました。

エラー:コードは生成されませんでした。クライアントを生成しようとした場合、メタデータドキュメントに有効なコントラクトまたはサービスが含まれていないか、すべてのコントラクト/サービスが/ referenceアセンブリに存在することが判明したことが原因である可能性があります。すべてのメタデータドキュメントをツールに渡したことを確認します。できました。

どんな解決策でもありがたいです。

5
Ahmad1334

短い答え

開発コマンドプロンプトを開いて実行し、プロキシクラスを生成します。

svcutil http://airarabia.isaaviations.com/webservices/services/AAResWebServices?wsdl

httpの代わりにhttpsを使用したことに注意してください。サーバーの証明書により、svcutilで問題が発生します。クラスをプロジェクトフォルダにコピーします。

NuGetのSystem.ServiceModel.Primitivesをプロジェクトの依存関係に追加します。 ASP.NET Coreはweb.configファイルを使用しないため、プロキシクラスを作成するときに、自分でバインディングを作成する必要がある場合があります。例:

var binding = new BasicHttpsBinding(BasicHttpsSecurityMode.Transport);
var address = new EndpointAddress("http://airarabia.isaaviations.com/webservices/services/AAResWebServices");
var client = new AAResWebServicesClient((Binding)binding, address);

バインディングでは、暗号化されていない接続を受け入れる航空会社がないため、BasicHttpsBindingが使用されます。 SabreにはTLS 1.2以降が必要です。

説明

航空会社とGDSは、Web相互運用性の標準に準拠しているとは言えません。それらは十分に大きいので、何か変更がある場合、それらを収容しなければならないのは旅行代理店です。 their standardを指定すると、変更する必要もなくなります。

たとえば、OTA標準とSabreの実装は、標準になっていなかったSOAPの代替案であるebXMLを使用して2003年に作成されました。その後、後のSOAP標準の一部にならないメカニズムを使用してSOAPでebXMLを使用しました。混乱を修正して相互運用性を確保するためにWS- *標準が作成されたとき、それらは気にさえしませんでした。

あなたが提供したWSDLはSabreのものに似ています。 OTA_PINGのようなOTAの操作のsomeを使用し、カスタム操作を追加します。幸い、匿名の内部型のようなツールブレーカーは含まれていません。

could 2008より前の.NETスタックを使用して、wsdl.exeを使用してASMXプロキシを作成します。私の知る限り、これは.NET Coreに移植されていません。 たぶんこれは、Windows互換機能パックの一部です。結局のところ、それはis非準拠であり、10年前に廃止されました。 ASMXも、年齢の大幅なアップグレードはありません。 I have ASXMサービスをAmadeusなどで使用する場合、過去にデシリアライザで同時実行の問題が発生します。

そして、Farelogixなど、自分のXSDを尊重しないものもあります。それらは列挙の範囲外の値を返し、「まあ、XSDは情報提供のみを目的としています」と言うかもしれません。 wsdlファイルは明確にマークされていますnot for production use

残念ながら一般的な解決策はありません。ここにいくつかのオプションがあります:

  • .NET Coreを使用する場合、wsdl.exeとASMXは問題外です。それらを使用する必要がある場合は、フルフレームワークに切り替える必要があります。
  • 各サービスのWCF individualプロキシを作成します。ファイルのサイズははるかに小さくなり、複数のサービスで使用されるエアポートのようなタイプ間の衝突を回避できます。これらのサービスは、わずかな変化または非互換性さえあります。
  • Fiddlerまたは別のツールを使用して、要求と応答をキャプチャします。これらをテンプレートとして使用して、プレーンなHTTP GETリクエストを作成します。これはダーティなソリューションですが、プロバイダーのWSDLとXSDを信頼できない場合は、couldより迅速で信頼性が高まります。

[〜#〜]警告[〜#〜]

電話をかけても、プロバイダーと通信できるわけではありません。 SOAPを介したebXMLの主な問題の1つは、本文は問題ないが、認証に使用されるものを含むheadersがすべて間違っていることです。これは、認証要素を作成する必要があることを意味します

別の問題は、認証フィールドが誤用されることが多いことです。たとえば、検討する認証ヘッダーsessionトークンを使用します。 GDSは引き続きメインフレームを使用し、これらのセッショントークンは実際の端末セッションにマップされることがよくあります。

つまり、認証ヘッダーを生成するためにWCFに依存する代わりに、認証ヘッダーを手動で作成する必要があります。これは、トランザクションがステートフルであることも意味します。予約するには、その予約に使用されたセッションを追跡し、新しいトランザクションを開始する前に、以前のトランザクションがすべて完了していることを確認する必要があります。

7

WSDLファイルをローカルにダウンロードします。次に、次のコマンドを実行します。

_wsdl.exe /verbose /namespace:Air /out:D:\t\ar /protocol:SOAP /language:CS C:\path\to\wsdl\AAResWebServices_1.wsdl
_

名前空間を任意の名前空間に変更します。

WSDL.exeはWindows SDKの一部です。

_C:\Program Files (x86)\Microsoft SDKs\Windows
_

鉱山はC:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Binにありました

これにより、問題なくクラスが生成されました。このソリューションをテストしました。

4
Sunil