N'Service WCF utiliser plusieurs threads pour traiter les requêtes entrantes?

Comment puis-je m'assurer qu'un service WCF utilise des threads à partir d'un pool de threads pour traiter les messages entrants?

Au moment de la simple invocation de méthode comme " return null;' prend environ 45 secondes, tandis qu'une autre demande en cours de traitement

Voici comment j'ai annoté ma classe de service:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]
    public partial class MyService : IMyService {
...
}

Mais quand je regarde les processus dans le gestionnaire des tâches, il semble être l'utilisation d'un constant nombre de threads. Même sous charge.


public ActionResult SelectDatabase(string param)
        {
            if (!String.IsNullOrEmpty(param))
            {
            try
            {
                MyServicece svc = new MyService();
                Database[] dbsArray = svc.GetDatabases(param);
                if (depsArray != null)
                    ViewData["depsArray"] = depsArray;

                return View();
            }
            catch (Exception exc)
            {
                //log here                
                return ActionUnavailable();
            }
        }

Voici mon comportement en service:

<?xml version="1.0"?>
<configuration>
<runtime>
</runtime>
<system.net>
<connectionManagement>
<add address="*" maxconnection="100" />
</connectionManagement>
</system.net>
<system.serviceModel>
<diagnostics performanceCounters="Default" />
<bindings>      
<netTcpBinding>
<binding sendTimeout="00:02:00" receiveTimeout="00:02:00" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647">
<security mode="None">           
</security>
</binding>
</netTcpBinding>
</bindings>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<behaviors>
<endpointBehaviors>
<behavior name="CrossDomainServiceBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="MyService.MyServiceBehavior">
<serviceThrottling maxConcurrentCalls="100"   maxConcurrentInstances="100" maxConcurrentSessions="100" />
<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
<serviceMetadata httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="MyService.MyServiceBehavior" name="MyService.MyService">
<endpoint address="MyService" binding="netTcpBinding" contract="AService.IAServ"  isSystemEndpoint="false" />
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
</service>
<service behaviorConfiguration="MyService.MyServiceBehavior" name="MyService.MyServiceAdmin">
<endpoint address="MyServiceAdmin" binding="netTcpBinding" contract="MyService.IMyServiceAdmin"  isSystemEndpoint="false" />
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />        
</service>
</services>
</system.serviceModel>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

Ici est de savoir comment je crée une instance de service:

ServiceHost myserviceHost = new ServiceHost(typeof(MyService), new Uri(String.Format("net.tcp://{0}/", _bindAddress)));
myserviceHost.Open();
Console.WriteLine(myserviceHost.BaseAddresses[0]);
InstanceContextMode = moyen Unique: vous avez un singleton - juste une seule instance du service. Pas très évolutif! ConcurrencyMode = Plusieurs moyens, qui singleton peut desservir plusieurs demandes de service à la fois - mais il signifie aussi, votre service de la mise en œuvre du code 100% de thread-safe - pas une tâche facile! Je vous conseille d'utiliser InstanceContextMode.PerCall et ConcurrencyMode.Single - de cette façon, chaque entrant WCF demande a son propre instance d'un service de classe pour répondre à la demande. La WCF runtime peut gérer plusieurs demandes simultanées, votre code est facile à écrire.
double possible: stackoverflow.com/questions/1609703/...
Parfois InstanceContextMode = Unique est ok - par exemple lorsque l'API est apatride et juste transmet l'appel. Pas besoin d'avoir plus d'une instance du service jamais créé. Par exemple, les appels de méthode que le retour des trucs comme longueurs de file d'attente ou de transmettre des données à une file d'attente de traitement... Et de l'écriture 100% fil code de sécurité est le comportement standard pour certains d'entre nous - pas tout le monde est un script kiddie.
Veuillez voir mon udpated question.

OriginalL'auteur kseen | 2012-02-17