WCF サービスがあり、それを RESTfull サービスと SOAP サービスの両方として公開したいと考えています。誰かが前にこのようなことをしたことがありますか?
6 に答える
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 Plain Old XMLの POX 動作
<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リクエスト をブラウザで試して、
サービス参照を追加した後の 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");
もう 1 つの方法は、2 つの異なるサービス コントラクトを公開し、それぞれを特定の構成で公開することです。これにより、コード レベルでいくつかの重複が生成される可能性がありますが、最終的には、それを機能させたいと考えています。
この投稿には、「Community wiki」による非常に優れた回答が既にあります。Rick Strahl の Web ブログも参照することをお勧めします。このような WCF Rest に関する多くの優れた投稿があります。
この種のMyService-Serviceを取得するために両方を使用しました...その後、JQueryまたはJavaの石鹸のRESTインターフェイスを使用できます。
これは私の Web.Config からのものです:
<system.serviceModel>
<services>
<service name="MyService" behaviorConfiguration="MyServiceBehavior">
<endpoint name="rest" address="" binding="webHttpBinding" contract="MyService" behaviorConfiguration="restBehavior"/>
<endpoint name="mex" address="mex" binding="mexHttpBinding" contract="MyService"/>
<endpoint name="soap" address="soap" binding="basicHttpBinding" contract="MyService"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="restBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
そして、これは私のサービスクラスです (.svc-codebehind、インターフェースは不要です):
/// <summary> MyService documentation here ;) </summary>
[ServiceContract(Name = "MyService", Namespace = "http://myservice/", SessionMode = SessionMode.NotAllowed)]
//[ServiceKnownType(typeof (IList<MyDataContractTypes>))]
[ServiceBehavior(Name = "MyService", Namespace = "http://myservice/")]
public class MyService
{
[OperationContract(Name = "MyResource1")]
[WebGet(ResponseFormat = WebMessageFormat.Xml, UriTemplate = "MyXmlResource/{key}")]
public string MyResource1(string key)
{
return "Test: " + key;
}
[OperationContract(Name = "MyResource2")]
[WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "MyJsonResource/{key}")]
public string MyResource2(string key)
{
return "Test: " + key;
}
}
実際には Json または Xml のみを使用しますが、どちらもデモ用です。これらは、データを取得するための GET リクエストです。データを挿入するには、属性を持つメソッドを使用します。
[OperationContract(Name = "MyResourceSave")]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, UriTemplate = "MyJsonResource")]
public string MyResourceSave(string thing){
//...
1 つの Web サービスのみを開発し、それを多数の異なるエンドポイント (つまり、SOAP + REST、XML、JSON、CSV、HTML 出力) でホストしたい場合。また、まさにこの目的のために私が構築したServiceStackの使用を検討する必要があります。開発するすべてのサービスは、構成を必要とせずにすぐに使用できる SOAP エンドポイントと REST エンドポイントの両方で自動的に利用できます。
Hello Worldの例は、単純な with サービスを作成する方法を示しています (構成は必要ありません)。
public class Hello {
public string Name { get; set; }
}
public class HelloResponse {
public string Result { get; set; }
}
public class HelloService : IService
{
public object Any(Hello request)
{
return new HelloResponse { Result = "Hello, " + request.Name };
}
}
他の構成は必要ありません。このサービスは、次の REST ですぐに利用できます。
また、使いやすい HTML 出力( Accept:text/htmlを持つ HTTP クライアント (ブラウザーなど) で呼び出された場合) が組み込まれているため、サービスの出力をよりよく視覚化できます。
さまざまな REST 動詞の処理も簡単です。C# の 1 ページで完全な REST サービス CRUD アプリを次に示します (WCF を構成するよりも少ない ;):
MSDN には、これに関する記事があるようです。
https://msdn.microsoft.com/en-us/library/bb412196(v=vs.110).aspx
はじめに:
既定では、Windows Communication Foundation (WCF) はエンドポイントを SOAP クライアントのみが使用できるようにします。「方法: 基本的な WCF Web HTTP サービスを作成する」では、エンドポイントを非 SOAP クライアントで使用できるようにします。Web エンドポイントと SOAP エンドポイントの両方で同じコントラクトを使用できるようにしたい場合があります。このトピックでは、これを行う方法の例を示します。
これは私がそれを機能させるためにしたことです。エンドポイントの動作内に
webHttp automaticFormatSelectionEnabled="true"を配置してください。
[ServiceContract]
public interface ITestService
{
[WebGet(BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/product", ResponseFormat = WebMessageFormat.Json)]
string GetData();
}
public class TestService : ITestService
{
public string GetJsonData()
{
return "I am good...";
}
}
内部サービス モデル
<service name="TechCity.Business.TestService">
<endpoint address="soap" binding="basicHttpBinding" name="SoapTest"
bindingName="BasicSoap" contract="TechCity.Interfaces.ITestService" />
<endpoint address="mex"
contract="IMetadataExchange" binding="mexHttpBinding"/>
<endpoint behaviorConfiguration="jsonBehavior" binding="webHttpBinding"
name="Http" contract="TechCity.Interfaces.ITestService" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8739/test" />
</baseAddresses>
</host>
</service>
エンドポイントの動作
<endpointBehaviors>
<behavior name="jsonBehavior">
<webHttp automaticFormatSelectionEnabled="true" />
<!-- use JSON serialization -->
</behavior>
</endpointBehaviors>