次のXML構成があります
<system.serviceModel>
<services>
<service name="MyService.MyServiceREST" behaviorConfiguration="MyServiceTypeBehaviors">
<Host>
<baseAddresses>
<add baseAddress="http://localhost:1234/MyService/xml"/>
</baseAddresses>
</Host>
<endpoint address="" binding="webHttpBinding" behaviorConfiguration="xmlBehavior" contract="MyService.IMyService" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceTypeBehaviors" >
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="True"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="xmlBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
Configを使用するのではなく、C#コードで実装したい。
このサービスをRESTサービスとして公開するためにwebHttpでEndPointを実行するユーザーを理解できません。
ServiceHost serviceHost = new ServiceHost(singletonInstance, "http://localhost:1234/MyService/xml");
// Create Meta Behavior
ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;
serviceHost.Description.Behaviors.Add(behavior);
Binding mexBinding = MetadataExchangeBindings.CreateMexHttpBinding();
serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, "mex");
WSHttpBinding httpBinding = new WSHttpBinding(SecurityMode.None);
serviceHost.AddServiceEndpoint(typeof(MyService.IMyService), httpBinding, "rest");
通常、RESTをWCFで実行する場合、configで<webHttp>
動作を使用するか、またはWebServiceHost
クラスを使用できます( "プレーンバニラ"ServiceHost
)。WebServiceHost
を使用すると、RESTを機能させるために必要な微調整とビットおよびピースがすべて含まれます-これ以上webHttpの動作は必要ありません。
もちろん、これは、別のWebServiceHost
(System.ServiceModel.Web
内)が必要であることを意味します。これは、RESTとしてのみサービスをホストします。これは、探しています:
WebServiceHost webServiceHost =
new WebServiceHost(singletonInstance, "http://localhost:1234/MyService/xml");
WebHttpBinding webBinding = new WebHttpBinding();
webServiceHost.AddServiceEndpoint(typeof(MyService.IMyService), webBinding, "rest");
もう1つのオプションは、サービスエンドポイントを通常のサービスホストに追加し、そのエンドポイントでWeb http動作を構成するだけです。エンドポイント(およびサービス)の動作は、結局のところ、インスタンス化できる通常の.NETクラスです。適切なBehaviors
コレクション(サービスまたは個々のエンドポイント)に追加します。
WebHttpBinding restBinding = new WebHttpBinding();
ServiceEndpoint restSEP =
serviceHost.AddServiceEndpoint(typeof(MyService.IMyService),
restBinding, "rest");
restSEP.Behaviors.Add(new WebHttpBehavior());
どちらの方法でもあなたの目標を達成できるはずです。 (または少なくとも近づく:-)