これが私の解決策です:
少なくとも Visual Studio 2012 が必要です。
WCF サービス ライブラリ プロジェクトを作成します。
Xsd ファイルを含めて、データ コントラクト ラッパーを自動的に作成します。
ServiceContract とクラスを次のように記述します。
using System;
using System.Linq;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
namespace RestSoapTest
{
public class Service1 : IService1
{
public List<CompositeType> GetData(string paramA, string paramB)
{
List<CompositeType> output = new List<CompositeType>();
output.Add(new CompositeType()
{
Key = paramA,
Value = paramB,
});
output.Add(new CompositeType()
{
Key = paramA,
Value = paramB,
});
output.Add(new CompositeType()
{
Key = paramA,
Value = paramB,
});
return output;
}
public void PutData(string paramA, string paramB, List<CompositeType> data)
{
throw new NotImplementedException();
}
}
[ServiceContract]
public interface IService1
{
[OperationContract]
[WebGet(UriTemplate = "GetData/{paramA}/{paramB}")]
List<CompositeType> GetData(string paramA, string paramB);
[OperationContract]
[WebInvoke(UriTemplate = "PutData/{paramA}/{paramB}")]
void PutData(string paramA, string paramB, List<CompositeType> data);
}
[DataContract]
public class CompositeType
{
[DataMember]
public string Key { get; set; }
[DataMember]
public string Value { get; set; }
}
}
(DataContract を手動で記述するか、Xsd で制御します)
Web ホスト プロジェクトを追加し、WCF プロジェクトを参照して、この web.config ファイルを追加します。
<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint name="standardRest" automaticFormatSelectionEnabled="true" defaultOutgoingResponseFormat="Json" helpEnabled="true"/>
</webHttpEndpoint>
<mexEndpoint>
<standardEndpoint name="standardMex"/>
</mexEndpoint>
</standardEndpoints>
<services>
<service name="RestSoapTest.Service1">
<endpoint name="rest" address="" kind="webHttpEndpoint" endpointConfiguration="standardRest" contract="RestSoapTest.IService1"/>
<endpoint name="mex" address="mex" kind="mexEndpoint" endpointConfiguration="standardMex" contract="RestSoapTest.IService1"/>
<endpoint name="soap" address="soap" binding="basicHttpBinding" contract="RestSoapTest.IService1"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment>
<serviceActivations>
<add relativeAddress="RestSoapTest.svc" service="RestSoapTest.Service1"/>
</serviceActivations>
</serviceHostingEnvironment>
</system.serviceModel>
<system.web>
<compilation debug="true"/>
</system.web>
</configuration>
これで、ブラウザで次のことができます。
/RestSoapTest.svc = SOAP エンドポイント/ヘルプ ページ
/RestSoapTest.svc?wsdl = SOAP メタデータ
/RestSoapTest.svc/help = 自動休憩ヘルプ ページ
/RestSoapTest.svc/url/to/method = REST アクションの実行
Get メソッドの場合は、WebGet を使用し、UriTemplate とメソッド プロトタイプのパラメーター数が一致していることを確認してください。そうしないと、エラーが発生します。
Put メソッドの場合は、WebInvoke を使用し、UriTemplate のパラメーター数が等しい (プロトタイプの数 + 1) ことを確認します。
これを行うと、マップされていない単一のパラメーターは、WCF フレームワークによって、HTTP ポストの要求本文を介して受信されると想定されます。
本体から複数のパラメーターを受け取る必要がある場合は、パラメーターの形式を Wrapped に設定する必要があります。デフォルトは Bare です。ラップされた auto は、parameterName/value プロパティで複数のパラメーターをラップします。