1. ホーム
  2. wcf

[解決済み] WCFサービスのREST / SOAPエンドポイント

2022-03-23 14:40:07

質問

私はWCFサービスを持っており、それをRESTfullサービスとSOAPサービスの両方として公開したいと思っています。 このようなことを行ったことのある人はいますか?

どのように解決するのですか?

2つの異なるエンドポイントでサービスを公開することができます。 SOAPの方はSOAPをサポートするバインディング(例:basicHttpBinding)を、RESTfulの方はwebHttpBindingを使用することができます。RESTサービスはJSONであると仮定して、その場合、次のような動作設定で2つのエンドポイントを構成する必要があります。

<endpointBehaviors>
  <behavior name="jsonBehavior">
    <enableWebScript/>
  </behavior>
</endpointBehaviors>

あなたのシナリオにおけるエンドポイント設定の例は次のとおりです。

<services>
  <service name="TestService">
    <endpoint address="soap" binding="basicHttpBinding" contract="ITestService"/>
    <endpoint address="json" binding="webHttpBinding"  behaviorConfiguration="jsonBehavior" contract="ITestService"/>
  </service>
</services>

で、サービスが利用できるようになります。

操作コントラクトに[WebGet]を適用して、RESTfulにする。 例

public interface ITestService
{
   [OperationContract]
   [WebGet]
   string HelloWorld(string text)
}

RESTサービスがJSONでない場合、操作のパラメータに複合型を含めることができないので注意してください。

SOAPとRESTfulなPOX(XML)のための投稿への返信

返送形式がプレーンオールドXMLの場合、これはSOAPとXMLの両方で動作する例です。

[ServiceContract(Namespace = "http://test")]
public interface ITestService
{
    [OperationContract]
    [WebGet(UriTemplate = "accounts/{id}")]
    Account[] GetAccount(string id);
}

RESTにおけるPOXの動作 プレーンオールドXML

<behavior name="poxBehavior">
  <webHttp/>
</behavior>

エンドポイント

<services>
  <service name="TestService">
    <endpoint address="soap" binding="basicHttpBinding" contract="ITestService"/>
    <endpoint address="xml" binding="webHttpBinding"  behaviorConfiguration="poxBehavior" contract="ITestService"/>
  </service>
</services>

でサービスを提供する予定です。

RESTリクエスト ブラウザで試してみてください。

<ブロッククオート

http://www.example.com/xml/accounts/A123

SOAPリクエスト サービスリファレンスを追加した後のSOAPサービスのクライアントエンドポイントの設定。

  <client>
    <endpoint address="http://www.example.com/soap" binding="basicHttpBinding"
      contract="ITestService" name="BasicHttpBinding_ITestService" />
  </client>

C# で

TestServiceClient client = new TestServiceClient();
client.GetAccount("A123");

もう一つの方法は、2つの異なるサービス・コントラクトを公開し、それぞれに特定の設定を行うことです。これはコードレベルで重複を発生させるかもしれませんが、最終的にはそれを動作させたいと思うでしょう。