【问题标题】:Add a Binding Extension via Code通过代码添加绑定扩展
【发布时间】:2010-04-06 02:11:28
【问题描述】:

我正在尝试找出一种通过代码而不是通过配置文件将绑定扩展添加到端点的方法。理想情况下,我希望它只是我放在服务方法上的一个属性。

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

【问题讨论】:

    标签: wcf


    【解决方案1】:

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

    如果需要使用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,因此绑定代码对我不可用,尽管我可以将其子类化并挂钩。
    • 这不适用于 WebServiceHost,因为它会自动找到端点并创建自己的绑定。您不能在 CreateServiceHost 中创建绑定。
    • 只有在服务描述中没有找到它们,或者用户还没有配置端点时才会自动找到它们。
    • 所以我需要手动配置所有这些端点?还不如直接使用 web.config。
    【解决方案2】:

    所以我想通了,我必须先继承 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。

    【讨论】:

      猜你喜欢
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      • 2013-03-24
      • 1970-01-01
      相关资源
      最近更新 更多