IISとwcfクライアントでホストされる単純なwcfサービスを作成し、wcfサービスからFaultExceptionをキャッチしてから、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();
}
}
}
}
ただし、catch(FaultException)のclient.Abort()をclient.Close()に置き換えると、すべてがチャームのように機能し、wcf-serviceメソッドの11回目の呼び出し後にロックが発生しなくなります。
なぜそうなるのでしょうか?FaultExceptionがキャッチされた後、Abort()メソッドがセッションをクリーンアップしないのはなぜですか?