2016-04-25 17 views
2

私はさまざまなメソッドの1つがxmlを入力として必要とするWebサービスを使用しています。SOAPサービスメソッドのクラス定義C#

正しい応答を得るには、渡す必要がある構造があります。

Visual Studio内にサービス参照を追加し、生成したコントラクトクラス内のメソッドを見ることができます。

phyisically .xsdファイルを取得してxsd.exeを実行してクラスを生成しないで、正しいクラスを作成するにはどうすればよいですか?将来xml形式に変更が生じる可能性があるので、xsd.exeをもう一度実行する必要があります。これはうまくいきません。

、私は 良いされていない再Xsd.exeではを実行するために、XML形式に将来的に変更が必要になることができたよう任意のアイデアは

おかげ

+0

Webサービスアセンブリにアクセスできますか?具体的には、サービス定義を含むアセンブリですか? –

+0

webserviceにクラスまたはテキストのみが必要ですか?テキストだけの場合は、xmlファイルを読み込んでテキストとして送信するだけです。シリアライズされたクラスは、テキストxmlファイルと同じxmlを生成するので、同じテキストをもう一度シリアル化する(テキストを作成する)だけxmlファイルを逆シリアル化することは理にかなっていますか? – jdweng

答えて

1

素晴らしいことです。

あなたは、サービス契約の定義のクライアント側の表現を生成することは良くないという点で、完全に正しいです。サービスアセンブリの実際のサービス定義を参照し、実行時にChannelFactory<T>を使用してチャネルを構築する方が優れています。これは、多くの理由により、生成されたサービス参照を使用するよりはるかに優れたアプローチです。

  1. あなたは、サービスのバイナリへのアクセスを持っていない:

    は、このアプローチにあなたの方法に立つことが2つだけあります。あなたは、サービスを定義するために使用された実際のタイプを消費することができなくてはなりません。

  2. サービスバイナリは利用可能ですが、気にせず、必ずしもクライアントアプリケーションから消耗したくないあらゆる種類のものを含む「ユーバーアセンブリ」にコンパイルされます。

上記の2つの条件の1つが真の場合、申し訳ありませんが、xsd.exeを使用して生成されたクライアントプロキシに頼らざるを得ず、これが発生するすべてのペナルティを受け入れる必要があります。 2番目の条件が真である場合、サービス定義コードを別のアセンブリに抽出するようにサービスの所有者に依頼することができ、記述された方法を使用して通常どおり処理を進めることができます。

私はそう私はちょうど たSOAPEnvelopeを作成し、 リクエストのボディに生成されたXMLを追加しない...のXMLシリアライザを使用することができます手でクラスを持っていますか?

私はこのサービスもWCFを使用していると仮定していますか?

WCFのようなフレームワークを使用する点は、クライアントからサービスへのデータのシリアライズ、エンコーディング、および送信について気にする必要がないことです。 WCFはあなたのためにこれをすべて処理します。必要なのは、サービス定義を使用してWCFチャネルを作成することだけです(通常、これはインタフェース上のメソッドとしてサービス操作を定義するインタフェースです)。

これらのメソッドをチャネルインスタンスに対して呼び出すことができます。リクエストはXMLにシリアル化され、SOAPラッパーでラップされ、HTTPを介してサービスに送信されます。リクエストは受信され、アンラップされ、デシリアライズされます。あらゆる努力。

ここに例があります:https://stackoverflow.com/a/8869809/569662

+0

こんにちは返信いただきありがとうございます。私たちが表現を提供する必要があるので、彼らは柔軟性がありそうです。私は手近なクラスを持っているので、xmlシリアライザを使うことができます。しかし、xmlリクエストを使ってサービスを呼び出すと、soapEnvelopeを作成し、生成されたxmlをリクエストの本文に追加するだけですか? – tjhack

+0

@tjhack私は自分の答えを更新しました –

関連する問題