Подтвердить что ты не робот

Как создать 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.

Я не могу понять, кто должен делать EndPoint с webHttp, чтобы разоблачить эту службу как службу REST.

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");
4b9b3361

Ответ 1

Как правило, при выполнении REST с WCF вы можете использовать поведение <webHttp> в config, или вы можете использовать класс WebServiceHost (вместо "plain vanilla" 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");

Другим вариантом, который у вас есть, является добавление конечной точки службы на ваш обычный хост службы и просто настройка поведения веб-http в этой конечной точке - поведение конечной точки (и службы) - это просто обычные классы .NET, в конце концов, которые вы можете создать экземпляр и добавить в соответствующую коллекцию Behaviors (в службе или отдельной конечной точке):

WebHttpBinding restBinding = new WebHttpBinding();

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

Оба пути должны привести вас к вашей цели, я надеюсь! (или, по крайней мере, приблизиться: -)