【发布时间】:2010-04-06 02:11:28
【问题描述】:
我正在尝试找出一种通过代码而不是通过配置文件将绑定扩展添加到端点的方法。理想情况下,我希望它只是我放在服务方法上的一个属性。
到目前为止,似乎唯一没有公开公开的是绑定扩展。
【问题讨论】:
标签: wcf
我正在尝试找出一种通过代码而不是通过配置文件将绑定扩展添加到端点的方法。理想情况下,我希望它只是我放在服务方法上的一个属性。
到目前为止,似乎唯一没有公开公开的是绑定扩展。
【问题讨论】:
标签: wcf
如果你给我更多的上下文,我可以用你的代码片段重写。请让我知道您的绑定扩展名....
如果需要使用WebServiceHostFactory
public class ServiceHostFactory : WebServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
ServiceHost serviceHost = new ServiceHost(typeof(IService));
CustomBinding customBinding= new CustomBinding();
customBinding.Name = “myCustomBinding”;
customBinding.Elements.Add(new SomeBindingExtensionElement());
serviceHost.AddServiceEndpoint(typeof(IService), customBinding,
“http://localhost/service/CustomEndpoint”);
【讨论】:
所以我想通了,我必须先继承 WebServiceHostFactory:
/// <summary>
/// RestServiceFactory extends WebServiceHostFactory and adds support for JSONP encoding
/// </summary>
public class RestServiceFactory : WebServiceHostFactory
{
/// <summary>
/// Creates a ServiceHost using the first address in baseAddresses
/// </summary>
/// <param name="serviceType"></param>
/// <param name="baseAddresses"></param>
/// <returns></returns>
protected override System.ServiceModel.ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
Uri[] defaultAddresses = new Uri[1];
defaultAddresses[0] = baseAddresses[0];
ServiceHost host = new RestServiceHost(serviceType, defaultAddresses);
// Bind up the JSONP extension
CustomBinding cb = new CustomBinding(new WebHttpBinding());
cb.Name = "JSONPBinding";
// Replace the current MessageEncodingBindingElement with the JSONP element
var currentEncoder = cb.Elements.Find<MessageEncodingBindingElement>();
if (currentEncoder != default(MessageEncodingBindingElement))
{
cb.Elements.Remove(currentEncoder);
cb.Elements.Insert(0, new JSONP.JSONPBindingElement());
}
host.AddServiceEndpoint(serviceType.GetInterfaces()[0], cb, defaultAddresses[0]);
return host;
}
}
然后我必须继承 WebServiceHost 来修改它是如何设置行为的:
/// <summary>
/// RestServiceHost extends WebServiceHost to add JSONP support
/// </summary>
public class RestServiceHost : WebServiceHost
{
public RestServiceHost() : base() { }
public RestServiceHost(Type serviceType, params Uri[] baseAddresses) : base(serviceType,baseAddresses) { }
protected override void OnOpening()
{
base.OnOpening();
if (base.Description != null)
{
foreach (ServiceEndpoint endpoint in base.Description.Endpoints)
{
if ((endpoint.Binding != null) && (endpoint.Binding.CreateBindingElements().Find<JSONP.JSONPBindingElement>() != null))
{
if (endpoint.Behaviors.Find<WebHttpBehavior>() == null)
{
endpoint.Behaviors.Add(new WebHttpBehavior());
}
}
}
}
}
}
此更改的原因是由于自定义绑定,WebServiceHost 没有添加任何行为。
完成这两项更改后,请求通过正确的绑定扩展进行管道传输,无需更改 web.config。
【讨论】: