Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WCF: How do I add a ServiceThrottlingBehavior to a WCF Service?

I have the below code for returning back an instance of my WCF Service 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);

Lately I was having some trouble with timeouts and so I decided to add a throttling behavior, like such:

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

My question is, where in the above code should I add this throttlingBehaviour to my MusicRepo_DBAccess_ServiceClient instance?


From some of the examples I found on the web, they are doing something like this:

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

Notice that in the above code they are using a ServiceHost whereas I am not, and they are then opening it (with Open()) whereas I open the MusicRepo_DBAccess_ServiceClient instance...and this is what got me confused.

like image 693
Andreas Grech Avatar asked Nov 27 '22 19:11

Andreas Grech


1 Answers

Can be done in code for those, like me, who configure at runtime.

vb version:

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

c# version:

    ServiceThrottlingBehavior stb = new ServiceThrottlingBehavior {
        MaxConcurrentSessions = 100,
        MaxConcurrentCalls = 100,
        MaxConcurrentInstances = 100
    };
    ServiceHost.Description.Behaviors.Add(stb);
like image 108
Brian Avatar answered Feb 23 '23 16:02

Brian