如何在代码中创建WCF EndPointBehaviors而不是在配置文件中?

23

我有以下的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#代码中实现,而不是使用配置文件。

我无法弄清如何使用webHttp做EndPoint,将此服务公开为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");
1个回答

40

一般来说,使用WCF进行REST时,你可以在配置中使用<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");

你还有另一个选择,就是向你的常规服务主机添加服务端点,并仅在该端点上配置Web HTTP行为 - 端点(和服务)行为只是常规的.NET类,您可以实例化这些类并将其添加到适当的Behaviors集合中(在服务或单个端点上):

WebHttpBinding restBinding = new WebHttpBinding();

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

希望这两种方法都能帮助你达到目标,或者至少让你更接近目标 :-)


2
我忘记添加行为 restSEP.Behaviors.Add(new WebHttpBehavior());,加上之后就可以了!谢谢! - Tono Nam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接