Расширение поведения службы WCF, генерирующее исключение нулевой ссылки - PullRequest
1 голос
/ 22 апреля 2011

Итак, я пытаюсь написать службу маршрутизации.Идея состоит в том, что каждый раз, когда кто-то вызывает службу маршрутизации, конечная точка выбирается случайным образом расширением поведения WCF.Для этого я использовал слегка измененный пример из MSDN, который называется DynamicReconfiguration .Часть моего web.config выглядит так

<behaviors>
  <serviceBehaviors>
    <behavior>
     <behavior name="behaviorWithUpdate">
       <updateBehavior />
    </behavior>
  </serviceBehaviors>
</behaviors>
<extensions>
  <behaviorExtensions>
    <add name="updateBehavior" type="RouterService.UpdateBehavior, RouterService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  </behaviorExtensions>
</extensions>
<services>

и реализация поведения и расширения поведения

public class UpdateBehavior : BehaviorExtensionElement, IServiceBehavior
{
    void IServiceBehavior.AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
    {
    }
    void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        var rulesUpdateExtension = new RulesUpdateExtension();
        serviceHostBase.Extensions.Add(rulesUpdateExtension);
    }
    void IServiceBehavior.Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
    }
    class RulesUpdateExtension : IExtension<ServiceHostBase>
    {
        ServiceHostBase _owner;
        List<EndpointAddress> _endpoints = new List<EndpointAddress>
                                                       {
                                                           new EndpointAddress("http://localhost:19338/Service1.svc"),
                                                           new EndpointAddress("http://localhost:20464/Service2.svc")
                                                       };

        void IExtension<ServiceHostBase>.Attach(ServiceHostBase owner)
        {
            this._owner = owner;

            UpdateRules(DateTime.Now.Second % 2 == 0 ? _endpoints[0] : _endpoints[1]);
        }

        void IExtension<ServiceHostBase>.Detach(ServiceHostBase owner)
        {
        }

        void UpdateRules(EndpointAddress endpoint)
        {
            var rc = new RoutingConfiguration();

            var serviceEndpoint = new ServiceEndpoint(
                    ContractDescription.GetContract(typeof(IService1)),
                    new BasicHttpBinding(),
                    endpoint);
            rc.FilterTable.Add(new MatchAllMessageFilter(), new List<ServiceEndpoint> { serviceEndpoint });

            this._owner.Extensions.Find<RoutingExtension>().ApplyConfiguration(rc);
        }
    }

    public override Type BehaviorType
    {
        get { return typeof(UpdateBehavior); }
    }

    protected override object CreateBehavior()
    {
        return new UpdateBehavior();
    }
}

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

1 Ответ

1 голос
/ 22 апреля 2011

В примере проекта RoutingService код в файле routing.cs программно внедряет RoutingExtension в RoutingService. Обычно это делается в файле конфигурации с помощью элемента поведения: serviceBehaviors> поведение> маршрутизации для настройки таблицы фильтра для использования. Однако, поскольку службе WCF может быть назначено только одно поведение службы через файл конфигурации, пример проекта RoutingService динамически добавляет RoutingExtension в инициализацию узла службы.

Чтобы сделать то же самое в IIS, необходимо создать фабрику хостов настраиваемых служб для выполнения той же функции кода routing.cs в примере проекта. Посмотрите эту статью MSDN , чтобы узнать, как создать собственный хост. Также показано, как вы можете настроить его с помощью IIS.

...