c# - 如何在代码而不是配置中创建 WCF EndPointBehaviors?

标签 c# .net wcf configuration

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

最佳答案

通常,在使用 WCF 执行 REST 时,您可以使用 <webHttp>配置中的行为,或者您可以使用 WebServiceHost类(而不是“普通 Vanilla ” 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());

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

关于c# - 如何在代码而不是配置中创建 WCF EndPointBehaviors?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2142712/

相关文章:

c# - 无法解析格式为 2013-09-17T05 :15:27. 947 的日期字符串

c# - 编码变量参数 - __arglist 或替代

.NET 指南 : Why exception for two-letter acronyms?

asp.net - 在ASP.NET + WCF下长时间运行的线程进程

c# - 在已连接的客户端上处理套接字异常10060

c# - Linq - 使用 linq 在列表中获取不可用的 ID

c# - 不等待消息框的结果

.net - 如何以编程方式使 ListView 的列自动调整大小?

c# - 如何通过 MVC 网站在引用 DLL 中托管 WCF 服务?

html - 如何用我自己的内容更改 wcf 服务的 html 输出?