WebAPIはSOAPをサポートしていますか? MVC4でSOAPサーバーを作成しようとしていますが、WCFで実行できますが、WebAPIがこれを置き換えているようですが、SOAPを利用する方法はまだありません。 RESTスタイルインターフェイスを使用したJSON/XMLのみ。
スコット・ガスリーを引用すると:ここ数年、Web APIの登場が見られます。これは、より正式なサービス契約(SOAPまたはWS *)など)ではなく、プレーンHTTPで公開されるサービスです。
だから私はノーと言うでしょう。
WEB APIは、RESTベースのAPIに対するMicrosoftの答えです。SOAPが必要な場合は、WCFを使用してください。
ServiceStack を検討する必要があります。これにより、同じサービスがREST + SOAP APIをサポートできるようになりますが、SOAPのみが機能します- HTTP POSTいくつかの制限があります
SOAPの代替として、ServiceStackは、 Add ServiceStackを使用してURLから型付きAPIを生成できるWCFAdd Service Referenceのより良い代替手段を提供します参照ServiceStackVS に組み込まれている機能。
興味深いのは、C#RPCメソッドを使用してチャットWebサービスを作成および定義する際に WebAPI ApiControllerメソッド と同じ RPCアプローチとWCF を使用したにもかかわらず、まだそうではないことです。同じ会社が作成した独自のSOAP標準をサポートできます。
これは、ServiceStackの message-based design の証です。これは、 多数の利点同じサービスに耐えることができないREST、SOAP、MQエンドポイントを含む複数のエンドポイントとフォーマットをサポートし、必要に応じて サーバー側またはクライアント側のHTML Webサイトを生成 リッチ Northwindデータベースエディター の例を次に示します。これはServiceStackで構築されたため、リッチネイティブデスクトップクライアント、モバイルアプリ、モバイルアプリで呼び出すことができる型付きREST APIを自動的に有効にしますシングルページアプリ。
相互運用性、アクセシビリティ、後方互換性の理由でSOAPをサポートしていますが、不必要に複雑で、脆弱で、遅くて冗長であり、より良い代替手段があるため、Webサービスプラットフォームの構築にはお勧めしません使用する。私 InfoQのインタビューで詳細を説明する 。
WebApiは、すぐにSOAPをサポートしません。しかし、それは非常に柔軟なフレームワークであり、SOAPを処理するために「適応」できます:受信したSOAPメッセージ(結局プレーンXML)であり、応答をXML文字列として手動で生成し、適切なコンテンツタイプヘッダーと共に送信します( このために独自のコンテンツフォーマッタ )。
ニーズと既存のコードベースに応じて、これは努力する価値がある場合があります。または、WCFや既に説明した ServiceStack フレームワーク。
ServiceStack を見るとよいかもしれません。これはSOAPとRESTを1つのインターフェイスで簡単にサポートする必要があります。 WebサービスのWebAPIよりも一致 。
違いについてすべてを知っていると主張することはできませんが、彼らが主張する問題は、経験から言うことができるWeb APIアプローチに固有のものですare本当- APIの進化(実際のプロジェクトでは避けられない)は、Web APIでは非常に注意が必要です。そしてもちろん、Web APIはSOAPをサポートしていません。
Wed APIがSOAPをサポートしているわけではありませんが、SOAPにより、XMLを使用する標準であり、Web APIを使用してHTTP POST XMLを読み取り、XPathを使用して必要なノードを検索し、ノードをオブジェクトにデシリアライズするサービス。
最初に、ConfigureServicesにXMLサポートを追加する必要があります
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddXmlSerializerFormatters();
}
次に、コントローラーで、XMLDocumentを受け取り、目的のノードのXPath検索を使用するメソッドを追加するだけで(基本的にSOAPエンベロープ、ヘッダー、本文を削除)、オブジェクトをデシリアライズできます。私の場合、WSDLを使用してサービス参照を追加し、それを使用してオブジェクトをデシリアライズします。
[HttpPost("reservationxml")]
public void CreateReservationFromTSW(XmlDocument soapCreateReservationRq)
{
XmlNamespaceManager nsmgr = new XmlNamespaceManager(soapCreateReservationRq.NameTable);
nsmgr.AddNamespace("r", "http://soa.company.com/ReservationEnt");
nsmgr.AddNamespace("s", "http://www.w3.org/2003/05/soap-envelope");
XmlNodeList xmlNodeList = soapCreateReservationRq.SelectNodes("s:Envelope/s:Body/r:CreateReservationRq",nsmgr);
XmlNode xmlnode = xmlNodeList[0];
XmlSerializer serial = new XmlSerializer(typeof(ServiceReference1.CreateReservationRqType));
ServiceReference1.CreateReservationRqType rq = (ServiceReference1.CreateReservationRqType)serial.Deserialize(new XmlNodeReader(xmlnode));
}
次の画像でわかるように、サービスを消費しようとするサービスは、Request-Method POSTでAccept-Encoding:gzipを使用します。このため、Web APIを公開できますSOAPサービスのために消費されます。