ASP Web API に関する情報を入手しました。それは Web サービスには良いもののように見えますが、WCF サービスのように API 用に WSDL のようなものを作成するにはどうすればよいですか? サード パーティ コンポーネントはどのように私のサービスを使用できますか? または、各メソッドを手動で記述する必要がありますか?
4 に答える
見た目が良いかどうかは意見なので、試してみてください(個人的には好きです)
WDSLに関しては、WebAPIはSOAPベースではなくRESTfulAPIであるため、WSDLサポートはありません。WCFにはRESTサポートとSOAPがあるため、SOAPサービスとWSDLが必要な場合は、ScottGuのAPIに関する最新のブログを選択することをお勧めします。非常に興味深く、チュートリアルへのリンクがあります(WSDL生成の質問もコメントで回答されています)
http://weblogs.asp.net/scottgu/archive/2012/02/23/asp-net-web-api-part-1.aspx
WebApi には SOAP または WSDL のサポートはありません。WebApi が好きなら、REST と SOAP の両方をサポートするServiceStackを気に入るはずです。RESTサービスでもサービススタックでWSDLを生成できます。
これは、OP がおそらく尋ねようとしていたものとは少し異なるシナリオですが、「WCF サービスのように、API 用に WSDL のようなものを作成する方法」のより広い解釈です。
WCF サービスを公開できず、唯一のオプションが WebAPI であるという状況がありました。ただし、API を使用する当事者は SOAP/WSDL のみをサポートし、インテグレーターがホストして準拠する必要がある事前定義された WSDL を持っていました。
WSDL ファイルの提供
1 つの WebAPI アクションが WSDL ファイルを提供しましたが、これは単なる静的 WSDL ファイルでした。この方法では、WSDL の一部のクエリはサポートされていません。したがって、クライアントは URL requestyourdomain.com/SomeRoot/SomeApiPath?wsdl
を使用する必要があり、その後のクエリ文字列パラメータは無視され、完全な WSDL が提供されます。パラメータ[FromUri] string wsdl
は、このアクションが含まれる URL に対して選択されることを保証します?wsdl
が、値はありません。
public IHttpActionResult SomeApiPath([FromUri] string wsdl)
{
System.IO.FileStream wsdlFileStream = System.IO.File.OpenRead(System.Web.HttpContext.Current.Server.MapPath("~/Content/SomeThing.wsdl"));
var response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new StreamContent(wsdlFileStream);
response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/xml");
return ResponseMessage(response);
}
これは、API アクション メソッドが XML SOAP リクエストを処理して応答する必要があることを意味します。
SOAP リクエストの処理
WebAPI はパラメーターを XML 要求にバインドできますが、私はアクションにパラメーターを持たないことを選択し、代わりにRequest.Content.ReadAsStringAsync()
各アクションで使用して要求本文 (XML SOAP 要求) を取得し、XML to LINQ を使用して解析して特定の値を取得しました。必要だった。これにより、XML シリアライズ可能な POCO をリバース エンジニアリングして、WSDL で定義された要求構造と一致させることを試みる必要がなくなりました。
SOAP レスポンスの作成
Visual Studio で Svcutil.exe などのツールを使用して、シリアル化可能な XML POCO を生成できます。ここでは WCF を使用していないため、完全なサービス コントラクトは使用しませんが、C# クラスの POCO を取り出してデータを入力し、XML にシリアル化して応答を作成できるようにします。ただし、すべての正しい名前空間参照を持つ SOAP エンベロープを作成することは非常に困難です。私はいくつかの場所をハッキングし、実際には XML シリアライゼーションの代わりに文字列連結を使用しました。XML 文字列にシリアル化し、それを StringContent 応答で返します。
return ResponseMessage(
new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(soapResponseBody, System.Text.Encoding.UTF8, "text/xml")
});
注: 例外であっても、SOAP エンベロープ内の SOAP Fault としてキャッチし、XML に変換する必要があります。
上記のひどい回避策はすべて、SOAP を絶対にサポートする必要がある場合は、WebAPI 以外のものを使用する方がはるかに簡単になるという証拠です。私は WebAPI が大好きですが、SOAP/WSDL のみをサポートする別のシステムと統合する必要がある場合、WebAPI はその仕事に適したツールではありません。他に選択肢がない場合にこの問題を回避するためのアプローチの概要として上記を提供しますが、SOAP をサポートする WebAPI 以外のフレームワークを使用することをお勧めします。上記の問題に遭遇することは間違いなくあり、これらの問題を解決する方法を理解するには、XML シリアライゼーションと XML スキーマに関する豊富な経験が必要です。
また、誰かが事前定義された WSDL を持っていて、その WSDL を公開するサービスを実装するように他の人に依頼することは、非常に奇妙です/めったにありません。つまり、彼らはクライアント側から統合し、あなたはホストですが、リクエストの構造を決定します。通常は逆で、事前定義された WSDL を使用して公開するサービスを誰かが持っており、それを利用するためにクライアントを実装する必要がありますが、これは通常ははるかに簡単です。
ServiceStackは、自動生成されたメタデータ ページから利用可能なサービス定義から WSDL、XSD、およびスキーマ記述を自動的に生成するSOAPの組み込みサポートを含む優れた代替手段です。
ServiceStack 参照を追加
ServiceStack は、 Add ServiceStack Referenceを使用して URL から型指定された API を生成できるWCF のAdd Service Referenceよりも優れた代替手段も提供します。
WCF に対する利点
- シンプル小さな T4 テンプレートを使用して、生成された POCO タイプを保存します。T4 テンプレートを再実行するのと同じくらい簡単に更新
- 多彩なクリーン DTO は、すべての JSON、XML、JSV、MsgPack、および ProtoBuf汎用サービス クライアントで動作します
- 再利用可能な生成された DTO は、どのエンドポイントやフォーマットにも関連付けられていません。デフォルトは、再利用を最大限にするために部分的かつ仮想的です
- Resilient Messaging ベースのサービスには、RPC サービスよりも多くの利点があります。
- 柔軟なDTO 生成はカスタマイズ可能で、サーバーとクライアントは組み込みのデフォルトをオーバーライドできます
- DTO に注釈が付けられた統合リッチ サービス メタデータ。外部からアクセスされた場合、内部サービスは除外されます。