79

バックグラウンド:

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 を含める必要はまったくありませんが、サーバー側は Unix 上の PHP で実装されているため、Microsoft の独自のソリューションはサーバー側。

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

4

6 に答える 6

155

前提条件:サービスと公開されたWSDLファイルが既にあり、C#クライアントアプリケーションからWebサービスを呼び出す必要があります。

これを行うには、主に2つの方法があります。

A)SOAを実行する古い方法であるASP.NETサービス
B)Johnが提案したように、MSの最新のフレームワークであり、オープンおよびMS独自のプロトコルを含む多くのプロトコルを提供するWCF 。

ステップバイステップでサービス参照を追加する

最も簡単な方法は、C#アプリケーションでプロキシクラスを生成することです(このプロセスは、サービス参照の追加と呼ばれます)。

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

    サービス参照ダイアログの追加

    例としてhttp://www.dneonline.com/calculator.asmx?WSDLを使用しています

  4. ソリューションエクスプローラーで[サービス参照]を展開し、ダブルクリックしますCalculatorServiceReference(または前の手順で名前を付けたサービスに名前を付けたもの)。

    生成されたプロキシクラス名と名前空間が表示されます。

    私の場合、名前空間はSoapClient.CalculatorServiceReference、プロキシクラスの名前はですCalculatorSoapClient。上で述べたように、クラス名はあなたの場合によって異なる場合があります。

    サービス参照プロキシcalss

  5. C#ソースコードに移動し、以下を追加します

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

    Service1Client service = new Service1Client();
    int year = service.getCurrentYear();
    

お役に立てれば。問題が発生した場合は、お知らせください。

于 2011-07-09T11:21:33.683 に答える
25

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

とは言うものの、WSDLは複雑で厄介なものであり、可能な限り最初から作成することは避けています。サービスの信頼できる相互運用のためのいくつかのガイドラインを次に示します(Webリファレンス、WCF、Axis2 / Java、WS02、Ruby、Pythonなどを使用)。

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

</rant>:)

于 2011-07-14T02:40:15.153 に答える
7

「 PHPでのWCFサービスの使用」をご覧ください。それはあなたが必要とするものの基本を説明します。

理論の要約として:

WCFまたはWindowsCommunicationFoundationは、呼び出される方法(基になる通信方法)から抽象化されたサービスを定義できるようにするテクノロジです。

アイデアは、サービスが何をするか、サービスが何を提供するかについてのコントラクトを定義し、TCP、HTTP、SOAPなどのサービスを実際に消費するために使用される通信方法についての別のコントラクトも定義することです。

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

その他のリソース:

PHP5でのWCFの使用

AsloはNuSOAPを見てください。現在NuSphereを使用している場合、これはPHPからWCFサービスに接続するためのツールキットです。

于 2011-07-09T11:37:38.183 に答える
7

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

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();
    }
}
于 2011-07-14T20:33:44.980 に答える
6

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


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

于 2010-06-23T10:05:50.183 に答える
5

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

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

codeplex.com には、非常に生産的な WCF 関連のオープン ソース プロジェクトがいくつかあります。これらのプロジェクトは、Win Forms および Windows Presentation Foundation アプリケーション (スマート クライアントWeb クライアント、およびモバイル クライアント) を設計および実装するのに非常に役立ちます。これらを WCF と組み合わせて使用​​すると、あらゆる種類の Web サービスを賢く呼び出すことができます。

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

于 2011-07-11T20:59:42.130 に答える