2015-07-01 3 views
0

Я пытаюсь выяснить, куда засунуть этот объект:Как установить ServiceThrottlingBehavior для IIS прошел службу WCF программным

ServiceThrottlingBehavior stb = new ServiceThrottlingBehavior 
{ 
    MaxConcurrentSessions = 100, 
    MaxConcurrentCalls = 100, 
    MaxConcurrentInstances = 100 
}; 

Я нашел информацию о том, как настроить это в web.config, но я Я немного смутился об этом. Раньше у нас были вещи в нашем web.config, который выглядел так:

<service name="AuthenticationService.AuthenticationService" behaviorConfiguration="Development"> 
    <endpoint address="http://services.local/0.0.0.5/AuthenticationService.svc" 
       binding="basicHttpBinding" 
       bindingConfiguration="TUPSOAPBinding" 
       contract="AuthenticationService.ServiceDomain.ISecurityService" 
       name="SOAPCatalogService" /> 
    </service> 

Если мы по-прежнему используется, что я хотел бы точно знать, как настроить дросселирования через web.config, но мы обнаружили, что мы могли бы взять все эти конечные точки из web.config и все еще работали, и это было меньше обслуживания, поскольку нам не пришлось больше обновлять адрес для разных версий и сред.

Я также нашел информацию о том, как установить это программно на ServiceHost, но я не создаю ServiceHost программно. Я позволяю IIS позаботиться об этом.

Итак, есть ли программный способ для настройки дросселирования без web.config и без необходимости создавать ServiceHost?

EDIT: Или у меня есть способ сделать это в web.config без необходимости создавать запись <service /> для каждого из наших сервисов?

+0

Вам нужно будет создать пользовательский 'ServiceHost' и пользовательский' ServiceHostFactory' и скажите IIS использовать это вместо стандартного. Затем вы можете добавить поведение программно на свой собственный хост. Если я получу шанс, я отправлю пример позже. – Tim

+0

@Tim Спасибо, если у вас есть пример или я могу указать на то, что было бы здорово! – BVernon

+0

У меня есть пример, но я, вероятно, не смогу опубликовать его до поздней ночи (я на западном побережье США). – Tim

ответ

1

Один из способов сделать это - использовать разметку в файле .svc, чтобы проинструктировать IIS использовать свой собственный хост-службу и пользовательскую фабрику хостов. Для этого, конечно же, вы должны иметь собственный хост службы. Например:

using System; 
using System.ServiceModel; 
using System.ServiceModel.Description; 

public class MyServiceHost : ServiceHost 
{ 

    public MyServiceHost() 
     : base() { } 

    public MyServiceHost(Type serviceType, params Uri[] baseAddresses) 
     : base(serviceType, baseAddresses) { } 

    public MyServiceHost(object singletonInstance, params Uri[] baseAddresses) 
     : base(singletonInstance, baseAddresses) { } 

    protected override void OnClosing() 
    { 
     base.OnClosing(); 
    } 

    protected override void ApplyConfiguration() 
    { 
     base.ApplyConfiguration(); 
     this.Description.Behaviors.Add(new ServiceThrottlingBehavior 
     { 
      MaxConcurrentSessions = 100, 
      MaxConcurrentCalls = 100, 
      MaxConcurrentInstances = 100 
     }); 
    } 
} 

Ключевой момент выше является переопределением ApplyConfiguration(), где вы можете добавить свой ServiceThrottlingBehavior к хозяину пользовательских услуг.

IIS будет использовать ServiceHostFactory для создания экземпляра MyServiceHost, так что вы будете также создать хозяина фабрики пользовательских услуг, например, так:

public class MyServiceHostFactory : ServiceHostFactory 
{ 
    protected override ServiceHost CreateServiceHost(Type serviceType, params Uri[] baseAddresses) 
    { 
     return new MyServiceHost(serviceType, baseAddresses); 
    } 
} 

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

Заключительный шаг, чтобы изменить разметку SVC-файла, чтобы использовать свой собственный узел обслуживания и завода:

<%@ ServiceHost Langauge="C#" Service="MyCompany.MyService" 
    CodeBehind="MyService.svc.cs" Factory="MyCompany.MyServiceHostFactory" %> 

Имя службы должно быть полное имя службы, и завод также должно быть полностью квалифицированным именем вашего пользовательского завода-изготовителя.

Очевидно, вы можете добавить много материала на свой собственный хост-сервис (у нас есть контроль и обработка ошибок в нашем). Это было первоначально сделано в .NET 3.5, поэтому в 4.0/4.5 могут быть более новые или дополнительные способы (например, я знаю, что вы можете указать фабрику в файле конфигурации для активации без файлов, но это будет раздел <system.serviceModel>, который вы, похоже, хотите избежать.)

+0

Я думаю, что 'base.ApplyConfiguration();' должен идти в конце метода. В противном случае это дает ошибку. – BVernon