WCF: как добавить ServiceThrottlingBehavior в службу WCF? - PullRequest
4 голосов
/ 27 апреля 2009

У меня есть следующий код для возврата экземпляра моей службы WCF ServiceClient:

    var readerQuotas = new XmlDictionaryReaderQuotas()
    {
        MaxDepth = 6000000,
        MaxStringContentLength = 6000000,
        MaxArrayLength = 6000000,
        MaxBytesPerRead = 6000000,
        MaxNameTableCharCount = 6000000
    };


    var throttlingBehaviour = new ServiceThrottlingBehavior(){MaxConcurrentCalls=500,MaxConcurrentInstances=500,MaxConcurrentSessions = 500}; 
    binding = new WSHttpBinding(SecurityMode.None) {MaxReceivedMessageSize = 6000000, ReaderQuotas = readerQuotas};

    dualBinding = new WSDualHttpBinding(WSDualHttpSecurityMode.None)
                      {MaxReceivedMessageSize = 6000000, ReaderQuotas = readerQuotas};

    endpointAddress = new EndpointAddress("http://localhost:28666/DBInteractionGateway.svc"); 

    return new MusicRepo_DBAccess_ServiceClient(new InstanceContext(instanceContext), dualBinding, endpointAddress);

В последнее время у меня были некоторые проблемы с тайм-аутами, и поэтому я решил добавить дросселирующее поведение, например:

    var throttlingBehaviour = new ServiceThrottlingBehavior () {
        MaxConcurrentCalls=500, 
        MaxConcurrentInstances=500,
        MaxConcurrentSessions = 500
    }; 

Мой вопрос, , где в приведенном выше коде я должен добавить это throttlingBehaviour к моему MusicRepo_DBAccess_ServiceClient экземпляру?


Из некоторых примеров, которые я нашел в Интернете, они делают что-то вроде этого:

ServiceHost host = new ServiceHost(typeof(MyService));
ServiceThrottlingBehavior throttleBehavior = new ServiceThrottlingBehavior
{
    MaxConcurrentCalls = 40,
    MaxConcurrentInstances = 20,
    MaxConcurrentSessions = 20,
};
host.Description.Behaviors.Add(throttleBehavior);
host.Open();

Обратите внимание, что в приведенном выше коде они используют ServiceHost, тогда как я нет, и они затем открывают его (с Open()), тогда как я открываю экземпляр MusicRepo_DBAccess_ServiceClient ... и это то, что заставило меня запутался.

Ответы [ 3 ]

18 голосов
/ 14 августа 2013

Может быть сделано в коде для тех, кто, как и я, настраивает во время выполнения.

версия vb:

    Dim stb As New ServiceThrottlingBehavior
    stb.MaxConcurrentSessions = 100
    stb.MaxConcurrentCalls = 100
    stb.MaxConcurrentInstances = 100
    ServiceHost.Description.Behaviors.Add(stb)

c # версия:

    ServiceThrottlingBehavior stb = new ServiceThrottlingBehavior {
        MaxConcurrentSessions = 100,
        MaxConcurrentCalls = 100,
        MaxConcurrentInstances = 100
    };
    ServiceHost.Description.Behaviors.Add(stb);
6 голосов
/ 12 мая 2009

Регулирование - это поведение на стороне службы (сервера), а не на стороне клиента

Арнон

3 голосов
/ 27 апреля 2009

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

Некоторые разделы конфигурации для краткости исключены

<service 
    behaviorConfiguration="throttleThis" />

        <serviceBehaviors>
            <behavior name="throttleThis">
                <serviceMetadata httpGetEnabled="True" />
                <serviceThrottling
                    maxConcurrentCalls="40"
                    maxConcurrentInstances="20"
                    maxConcurrentSessions="20"/>
            </behavior>
        </serviceBehaviors>
...