Я создал простую службу wcf, размещенную в IIS и клиенте wcf, и выяснил, что когда вы ловите FaultException из службы wcf, а затем вызываете client.Abort (), чтобы освободить сессию (как сказали образцы Microsoft) не освобождает сеанс и зависает на 11-м вызове.
Вот пример:
Wcf Сервис:
[ServiceContract]
public interface IService1
{
[OperationContract]
string GetData(int value);
}
public class Service1 : IService1
{
public string GetData(int value)
{
throw new FaultException("Exception is here");
return string.Format("You entered: {0}", value);
}
}
Клиент:
class Program
{
static void Main(string[] args)
{
Service1Client client = null;
for(int i = 0; i < 15; i++)
{
try
{
client = new Service1Client();
client.GetData(100);
}
catch (TimeoutException timeoutEx)
{
Console.WriteLine(timeoutEx);
client.Abort();
}
catch (FaultException faultEx)
{
Console.WriteLine(faultEx);
client.Abort();
}
catch (CommunicationException commEx)
{
Console.WriteLine(commEx);
client.Abort();
}
}
}
}
Но если вы замените client.Abort () на client.Close () для catch (FaultException), тогда все будет работать как чудо, и после 11-го вызова метода wcf-service блокировки не будет.
Почему это может быть? Почему метод Abort () не очищает сеанс после перехвата FaultException?