web-dev-qa-db-ja.com

SOAP .NETのクライアント-参照または例?

背景:

私は、SOAPおよびその他のプロトコルを介して多くのタイプの単純なサービスを提供するWebサービスサイトを作成しています。目標は、たとえば変換、RSS解析、スパムチェック、およびその他の多くの種類の作業を簡単に行えるようにすることです。このサイトは主に初心者の開発者を対象としています。

私の問題:

そのためにC#や.NETを開発したことはありません。何年も前にVB6をハックしましたが、それだけです。ここでいくつか必要になりますC#でSOAPを介してRPC呼び出しを行う例。これを見つけるためにWebとStack Overflowを検索しようとしましたが、多くのリソースが見つかりませんでした。また、リソースをランク付けする方法がわかりません(古いもの、間違ったものなど)。

PHPで次のように呼び出される簡単なサンプルサービスを作成しました。

<?php
$client = new SoapClient('http://webservi.se/year'); //URL to the WSDL
echo $client->getCurrentYear(); //This method returns an integer, called "year"
?>

このメソッドをC#でできるだけ簡単に呼び出したいと思います。すべての参照と例は大歓迎です。どこから始めますか?どのクラス/モジュール/何を利用できますか?

より良い通信フレームワークがあれば、ソリューションはSOAPをまったく含む必要はありません(バックエンドは拡張可能です)が、サーバー側はPHPで実装されていることに注意してくださいUnixだから、Microsoftのプロプライエタリなソリューションはサーバー側では問題外です。

J. Random Web Developerが従うことのできるドキュメントを作成できるように(共有Webホスティングを使用している場合でも)これが必要なことに注意してください。したがって、最善のアプローチはコードでのみこれを行うことであると考えますが、これを行う他の方法ももちろん歓迎します。

68
Emil Vikström

私が理解しているように、C#クライアントアプリケーションからWebサービスを呼び出したいと思っています。あなたはすでにサービスと公開されたWSDLファイルを持っています(私が間違っているなら私を修正してください)。現在、最も簡単な方法は、C#アプリケーションでプロキシクラスを生成することです(このプロセスは、サービス参照の追加と呼ばれます)。これには主に2つの方法があります。NETは、ASP.NETサービスを提供します。これは、SOAを行う古い方法です。Johnが提案したように、WCF.

さて、十分な理論とステップバイステップでやってみましょう

  1. Visual Studioでプロジェクトを開く(または新しいプロジェクトを作成する)
  2. ソリューションエクスプローラーでプロジェクト(ソリューションではなくプロジェクト)を右クリックし、[サービス参照の追加]をクリックします。
  3. 以下のスクリーンショットに示すダイアログが表示されます。 wsdlファイルのURLを入力して、[OK]をクリックします。 [OK]をクリックした後にエラーメッセージが表示される場合は、URLから?wsdl部分を削除してみてください。 screen

  4. ソリューションエクスプローラーでサービス参照を展開し、ServiceReference1をダブルクリックします(名前は異なる場合があります)。生成されたプロキシクラス名と名前空間が表示されます。私の場合、名前空間はWindowsFormsApplication1.ServiceReference1、プロキシクラスの名前はService1Clientです。上で言ったように、クラス名はあなたのケースでは異なるかもしれません。 enter image description here

  5. C#ソースコードに移動します。 using WindowsFormsApplication1.ServiceReference1を追加します。

  6. これで、この方法でサービスを呼び出すことができます。

Service1Client service = new Service1Client();

int year = service.getCurrentYear();

問題が発生した場合、これがお役に立てば幸いです。

136
Davita

私はあなたが話していることのかなりの部分を実行しました。プラットフォーム間のSOAP相互運用性には、1つの基本的なルールがあります:CONTRACT FIRST。 notからWSDLをコードから派生させてから、別のプラットフォームでクライアントを生成しようとします。 「Hello World」タイプの関数以外のものは、コードの生成、実行時の会話、または(私のお気に入り)エラーを発生させずにすべてのデータを適切に送受信できません。

とはいえ、WSDLは複雑で厄介なものであり、可能な限りゼロから記述することは避けます。サービスの信頼できる相互運用のためのガイドラインを次に示します(Web参照、WCF、Axis2/Java、WS02、Ruby、Pythonなどを使用):

  • 先に進み、コードファーストを実行して初期WSDLを作成します。次に、コードを削除し、WSDLからサーバークラスを再生成します。ほとんどすべてのプラットフォームにこのためのツールがあります。これにより、特定のプラットフォームにある奇妙な習慣がわかります。WSDLをよりシンプルでわかりやすいものに調整することができます。微調整、再生成、繰り返し。この方法で多くのことを学ぶことができ、それは移植可能な知識です。
  • 複雑な型については、単純な古い言語クラス(POCO、POJOなど)に固執します。 List <>やDataTableのようなプラットフォーム固有の構造を使用しないでください。 PHP連想配列でさえ動作するように見えますが、プラットフォーム間でデバッグするのが難しい方法で失敗します。
  • 基本データ型に固執する:bool、int、float、string、date(Time)、および配列。奇妙なことに、データ型についてより具体的になればなるほど、時間の経過とともに新しい要件に敏a性が低下します。回避できる場合は、WSDLを変更したくないでしょう。
  • 上記のデータ型の1つの例外-何らかのNameValuePairメカニズムを自分に与えます。これらのリストが柔軟性の観点からあなたのベーコンを何回節約するかは信じられないでしょう。
  • WSDLの実際の名前空間を設定します。難しくはありませんが、名前空間「http://www.tempuri.org」で見たWebサービスの数を信じられないかもしれません。また、URLベースのネームスペース(「http://servicename.myweb.com/v1」ではなく、URN(「urn:com-myweb-servicename-v1」)を使用します。Webサイトではなく、抽象的な文字セットです。論理的なグループ化を定義します。おそらく、十数人の人々が私にサポートを求め、「ウェブサイト」に行ったと言っていましたが、うまくいきませんでした。

</rant> :)

24
mtutty

ブラウザで実行できる場合は、これと同じくらい簡単なものが動作します

var webRequest = WebRequest.Create(@"http://webservi.se/year/getCurrentYear");

using (var response = webRequest.GetResponse())
{
    using (var rd = new StreamReader(response.GetResponseStream()))
    {
        var soapResult = rd.ReadToEnd();
    }
}
7
Rob Allen

PHPでWCFサービスを使用 」をご覧ください。必要なものの基本を説明します。

理論の要約として:

WCFまたはWindows Communication Foundationは、方法から抽象化されたサービス(基礎となる通信方法)を定義して、それらを呼び出すことができるテクノロジです。

その考え方は、サービスが行うこととサービスが提供するものについての契約を定義し、さらに、TCP、HTTP、SOAPなど、サービスを実際に消費するために使用される通信方法に関する別の契約を定義することです。

記事の最初の部分 here があり、非常に基本的なWCFサービスの作成方法を説明しています。

その他のリソース:

PHP5でWCFを使用

AsloはNuSOAPをご覧ください。 NuSphere の場合、これはPHPからWCFサービスに接続できるツールキットです。

7
Jorge Córdoba

あなたは間違った場所を見ています。 Windows Communication Framework を検索する必要があります。


WCFは、クライアントとサーバーの両方で使用されます。

6
John Saunders

Here .NETクライアントアプリケーションからNuSOAPベースのWebサービスを呼び出すための素敵なチュートリアルを見つけることができます。ただし、IMOでは、サービスについて PHPのWSO2 Webサービスフレームワーク(WSO2 WSF/PHP) も考慮する必要があります。 PHP 2.0のWSO2 Webサービスフレームワークは、PHPおよびSOAPサービスの両方を作成するための、業界唯一のRESTライブラリを大幅に強化します を参照してください。それについて webminar もあります。

現在、.NETの世界では、相互運用性の問題を考慮して、WCFの使用も推奨しています。相互運用性の例は here にありますが、この例では、反対の代わりにPHP-client + WCF-serviceを使用しています。 PHPサービスとWFCクライアントを自由に実装してください。

Codeplex.comには、生産性が非常に高いと思われるWCFの関連するオープンソースプロジェクトがいくつかあります。これらのプロジェクトは、Win FormsおよびWindows Presentation Foundationアプリケーションの設計と実装に非常に役立ちます。 Smart ClientWeb Client 、および Mobile Client 。 WCFと組み合わせて使用​​して、あらゆる種類のWebサービスを適切に呼び出すことができます。

一般的に言えば、 パターンとプラクティスチーム は、.NETプラットフォーム、特にWebを扱うさまざまなオープンソースプロジェクトの優れたプラクティスと設計をまとめたものです。ですから、.NETクライアントに関連する設計上の決定の良い出発点だと思います。