代码之家  ›  专栏  ›  技术社区  ›  David Basarab

如何在代码中而不是配置中创建wcf endpointbehaviors?

  •  23
  • David Basarab  · 技术社区  · 15 年前

    我有以下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来使用该端点将该服务公开为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 回复  |  直到 15 年前
        1
  •  39
  •   marc_s    15 年前

    通常,在使用WCF进行REST时,可以使用 <webHttp> 配置中的行为,或者可以使用 WebServiceHost 等级(而不是“普通香草色” ServiceHost )。使用 WebService主机 包括所有必要的调整和片段,以使其余的东西工作-不需要更多的WebHTTP行为。

    当然,这意味着,你需要一个单独的 WebService主机 System.ServiceModel.Web ,它以独占方式托管服务。这可能是您要找的,也可能不是:

    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());
    

    我希望这两种方法都能使你达到你的目标!(或者至少让你的关系更近些:—)