如何在代码而不是配置中创建 WCF EndPointBehaviors?
Posted
技术标签:
【中文标题】如何在代码而不是配置中创建 WCF EndPointBehaviors?【英文标题】:How do I create WCF EndPointBehaviors in Code rather than the configuration? 【发布时间】: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");
【问题讨论】:
【参考方案1】:通常,在使用 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());
我希望这两种方式都可以使您实现目标! (或者至少让你更接近:-)
【讨论】:
我错过了添加restSEP.Behaviors.Add(new WebHttpBehavior());
的行为,它起作用了!谢谢!以上是关于如何在代码而不是配置中创建 WCF EndPointBehaviors?的主要内容,如果未能解决你的问题,请参考以下文章
强制 Soap/WCF 使用 HTTP 而不是 TCP 协议