Как программно установить ServiceThrottlingBehavior для службы WCF, размещенной на IIS

Я пытаюсь выяснить, куда засунуть этот объект:

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 самостоятельно?

РЕДАКТИРОВАТЬ: Или есть способ для меня сделать это в web.config без необходимости создавать <service /> вход для каждого из наших услуг?

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> раздел, который вы, кажется, хотите избежать.)

Другие вопросы по тегам