Добавьте расширение привязки через код - PullRequest
1 голос
/ 06 апреля 2010

Я пытаюсь найти способ добавить расширение привязки к конечной точке с помощью кода, а не с помощью файлов конфигурации. В идеале я хочу, чтобы это был просто атрибут, который я помещаю в метод обслуживания.

Пока что кажется, что единственное, что не раскрывается публично, - это обязательные расширения.

Ответы [ 2 ]

3 голосов
/ 06 апреля 2010

Если вы дадите мне больше контекста, я могу переписать, используя ваши фрагменты кода. Просто дайте мне знать названия ваших обязательных расширений ....

Если вам нужно использовать 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 голосов
/ 07 апреля 2010

Итак, я понял, мне нужно было сначала создать подкласс 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 не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...