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

構成ではなくコードで 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>

構成を使用するのではなく、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");

ベストアンサー1

通常、WCF で REST を実行する場合、<webHttp>構成内の動作を使用するか、WebServiceHostクラス (「プレーン バニラ」の代わりにServiceHost) を使用できます。 を使用すると、WebServiceHostREST を機能させるために必要なすべての調整と細かい部分が含まれます。webHttp の動作は不要になります。

もちろん、これは、サービスを REST としてのみホストする別のWebServiceHost( 内System.ServiceModel.Web) が必要であることを意味します。これは、探しているものかもしれませんし、そうでないかもしれません。

WebServiceHost webServiceHost = 
    new WebServiceHost(singletonInstance, "http://localhost:1234/MyService/xml");

WebHttpBinding webBinding = new WebHttpBinding();
webServiceHost.AddServiceEndpoint(typeof(MyService.IMyService), webBinding, "rest");

もう 1 つのオプションは、通常のサービス ホストにサービス エンドポイントを追加し、そのエンドポイントで Web http 動作を構成することです。エンドポイント (およびサービス) 動作は、結局のところ、インスタンス化して適切なコレクションBehaviors(サービスまたは個々のエンドポイント上) に追加できる通常の .NET クラスにすぎません。

WebHttpBinding restBinding = new WebHttpBinding();

ServiceEndpoint restSEP = 
    serviceHost.AddServiceEndpoint(typeof(MyService.IMyService), 
                                   restBinding, "rest");
restSEP.Behaviors.Add(new WebHttpBehavior());

どちらの方法でも、目標に到達できるはずです。(少なくとも、目標に近づくことができます :-)

おすすめ記事