web-dev-qa-db-ja.com

ASP.NET WebAPI +石鹸

WebAPIはSOAPをサポートしていますか? MVC4でSOAPサーバーを作成しようとしていますが、WCFで実行できますが、WebAPIがこれを置き換えているようですが、SOAPを利用する方法はまだありません。 RESTスタイルインターフェイスを使用したJSON/XMLのみ。

28
John Mitchell

スコット・ガスリーを引用すると:ここ数年、Web APIの登場が見られます。これは、より正式なサービス契約(SOAPまたはWS *)など)ではなく、プレーンHTTPで公開されるサービスです。

だから私はノーと言うでしょう。

19
Sandman

WEB APIは、RESTベースのAPIに対するMicrosoftの答えです。SOAPが必要な場合は、WCFを使用してください。

14
Paolo del Mundo

ServiceStack を検討する必要があります。これにより、同じサービスがREST + SOAP AP​​Iをサポートできるようになりますが、SOAPのみが機能します- HTTP POSTいくつかの制限があります

ServiceStack参照の追加

SOAPの代替として、ServiceStackは、 Add ServiceStackを使用してURLから型付きAPIを生成できるWCFAdd Service Referenceのより良い代替手段を提供します参照ServiceStackVS に組み込まれている機能。

WCFを超える利点

  • Simple小さいT4テンプレートを使用して、生成されたPOCOタイプを保存します。 T4テンプレートの再実行と同じくらい簡単に更新
  • 汎用性すべてのJSON、XML、JSV、MsgPack、ProtoBufでDTOのクリーンが機能 汎用サービスクライアント
  • 再利用可能生成されたDTOは、どのエンドポイントまたは形式にも結合されません。最大の再利用のためにデフォルトは部分的かつ仮想的です
  • 弾力性のあるメッセージングベースのサービスは、多くの RPCサービスの利点 を提供します
  • フレキシブルDTO生成はカスタマイズ可能で、サーバーとクライアントは組み込みのデフォルトを上書きできます
  • IntegratedDTOに注釈が付けられたリッチサービスメタデータ、 内部サービス は外部からアクセスされた場合は除外されます

WebAPIとWCFはどちらもRPCメソッドシグネチャを促進します

興味深いのは、C#RPCメソッドを使用してチャットWebサービスを作成および定義する際に WebAPI ApiControllerメソッド と同じ RPCアプローチとWCF を使用したにもかかわらず、まだそうではないことです。同じ会社が作成した独自のSOAP標準をサポートできます。

ServiceStackは同じサービスでREST、SOAP、HTMLおよびMQエンドポイントをサポートします

これは、ServiceStackの message-based design の証です。これは、 多数の利点同じサービスに耐えることができないREST、SOAP、MQエンドポイントを含む複数のエンドポイントとフォーマットをサポートし、必要に応じて サーバー側またはクライアント側のHTML Webサイトを生成 リッチ Northwindデータベースエディター の例を次に示します。これはServiceStackで構築されたため、リッチネイティブデスクトップクライアント、モバイルアプリ、モバイルアプリで呼び出すことができる型付きREST AP​​Iを自動的に有効にしますシングルページアプリ。

SOAPは依然としてリモートサービスにとっては貧弱な選択肢です

相互運用性、アクセシビリティ、後方互換性の理由でSOAPをサポートしていますが、不必要に複雑で、脆弱で、遅くて冗長であり、より良い代替手段があるため、Webサービスプラットフォームの構築にはお勧めしません使用する。私 InfoQのインタビューで詳細を説明する

13
mythz

WebApiは、すぐにSOAPをサポートしません。しかし、それは非常に柔軟なフレームワークであり、SOAPを処理するために「適応」できます:受信したSOAPメッセージ(結局プレーンXML)であり、応答をXML文字列として手動で生成し、適切なコンテンツタイプヘッダーと共に送信します( このために独自のコンテンツフォーマッタ )。

ニーズと既存のコードベースに応じて、これは努力する価値がある場合があります。または、WCFや既に説明した ServiceStack フレームワーク。

6
Konamiman

ServiceStack を見るとよいかもしれません。これはSOAPとRESTを1つのインターフェイスで簡単にサポートする必要があります。 WebサービスのWebAPIよりも一致

違いについてすべてを知っていると主張することはできませんが、彼らが主張する問題は、経験から言うことができるWeb APIアプローチに固有のものですare本当- APIの進化(実際のプロジェクトでは避けられない)は、Web APIでは非常に注意が必要です。そしてもちろん、Web APIはSOAPをサポートしていません。

3
Eamon Nerbonne

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サービスのために消費されます。 enter image description here

1
mavi