2010-04-06 101 views
1

我在想通过代码而不是通过配置文件来向端点添加绑定扩展。理想情况下,我希望它仅仅是我放置在服务方法上的一个属性。通过代码添加绑定扩展

到目前为止,似乎唯一没有公开暴露的是绑定扩展。

回答

0

所以我想通了,我只好先子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。

3

如果你给我更多的上下文,我可以使用你的代码片段重写。只要让我知道你的绑定扩展的名字....

如果您需要使用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”); 
+0

我应该说明我正在使用WebServiceHostFactory,所以绑定代码对我来说是不可用的,尽管我可能能够将其绑定到子类并挂钩它。 – FlySwat 2010-04-06 02:46:39

+0

我认为你最简单的方法是继承并钩入它......见上面.. – Nix 2010-04-06 12:07:19

+0

这不适用于WebServiceHost,因为它自动查找端点并创建它自己的绑定。您不能在CreateServiceHost中创建一个绑定。 – FlySwat 2010-04-06 17:10:42