2010-01-26 2 views
21

У меня есть следующий XML-конфигурацияКак создать WCF EndPointBehaviors в коде, а не в конфигурации?

<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# код, а не с помощью конфигурации.

Я не могу понять, кто должен делать 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"); 

ответ

38

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

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

WebHttpBinding restBinding = new WebHttpBinding(); 

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

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

+3

Работает WebServiceHost. БОЛЬШОЕ СПАСИБО!!! –

+2

Мне не хватало, чтобы добавить поведение 'restSEP.Behaviors.Add (новый WebHttpBehavior());' и это сработало! Благодаря! –

Смежные вопросы