web-dev-qa-db-ja.com

構成ではなくコードでWCF EndPointBehaviorsを作成するにはどうすればよいですか?

次の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");
23
David Basarab

通常、RESTをWCFで実行する場合、configで<webHttp>動作を使用するか、またはWebServiceHostクラスを使用できます( "プレーンバニラ"ServiceHost)。WebServiceHostを使用すると、RESTを機能させるために必要な微調整とビットおよびピースがすべて含まれます-これ以上webHttpの動作は必要ありません。

もちろん、これは、別のWebServiceHostSystem.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());

どちらの方法でもあなたの目標を達成できるはずです。 (または少なくとも近づく:-)

40
marc_s