Как я могу гарантировать, что служба WCF использует потоки из ThreadPool для обработки входящих сообщений?Использует ли служба WCF несколько потоков для обработки входящих запросов?
В настоящий момент простой вызов метода, например 'return null;' занимает около 45 секунд, в то время как другой запросы обработки
Вот как я аннотированный мой класс обслуживания:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]
public partial class MyService : IMyService {
...
}
Но когда я смотрю на процесс в диспетчере задач это, кажется, использует постоянное число потоков. Даже под нагрузкой.
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();
}
}
Вот мое поведение службы:
<?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>
Вот как я создаю экземпляр службы:
ServiceHost myserviceHost = new ServiceHost(typeof(MyService), new Uri(String.Format("net.tcp://{0}/", _bindAddress)));
myserviceHost.Open();
Console.WriteLine(myserviceHost.BaseAddresses[0]);
InstanceContextMode = SIngle означает: у вас есть ** singleton ** - всего один экземпляр службы. Не очень масштабируемый! ConcurrencyMode = Множество означает, что singleton может обслуживать сразу несколько запросов на обслуживание, но это также означает, что код реализации вашей службы ** должен быть 100% потокобезопасным - не простая задача! Я бы рекомендовал использовать 'InstanceContextMode.PerCall' и' ConcurrencyMode.Single' - таким образом, каждый входящий запрос WCF получает свой собственный экземпляр класса сервиса для обработки запроса. Рабочая среда WCF может обрабатывать несколько одновременных запросов, ваш код легко писать. –
Возможный дубликат: http: // stackoverflow.com/questions/1609703/wcf-concurrencymode-multiple-connection-best-practices-and-caching –
Иногда InstanceContextMode = Single - это нормально - например, когда API не имеет состояния и просто переадресовывает вызов. Не нужно иметь более одного экземпляра службы, когда-либо созданной. Например, вызовы методов, которые возвращают такие вещи, как длины очереди, или отправляют данные в очередь обработки ... И написание 100% -ного потока безопасного кода является стандартным поведением для некоторых из нас - не для всех это сценарий kiddie. – TomTom