【问题标题】:How do I create WCF EndPointBehaviors in Code rather than the configuration?如何在代码而不是配置中创建 WCF EndPointBehaviors?
【发布时间】:2011-01-09 16:57:19
【问题描述】:

我有以下 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");

【问题讨论】:

    标签: c# .net wcf configuration


    【解决方案1】:

    通常,在使用 WCF 进行 REST 时,您可以在配置中使用 &lt;webHttp&gt; 行为,也可以使用 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());
    

    我希望这两种方式都可以使您实现目标! (或者至少让你更接近:-)

    【讨论】:

    • 我错过了添加 restSEP.Behaviors.Add(new WebHttpBehavior()); 的行为,它起作用了!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多