使用错误的用户名密码打开异步WCF服务挂起

时间:2012-07-18 17:39:50

标签: wcf authentication asynchronous

我有一个实现'Custom-Username-Password-Validator'的WCF服务。

服务本身会根据本地文件

检查用户名+密码

如果没有匹配 - 它会抛出 FaultException 并带有消息。

当我同步使用服务时,它可以正常工作。

当我开始使用 ASYNC 时,我遇到了问题。

如果我传递错误的'用户名+密码'凭据 - 并打开客户端,

而不是立即从服务进入我的'Channel_Faulted()'方法,

客户端线程只是等待超时触发,

然后我得到'TimeoutException'。

try
{
    client = new MyServiceClient("WSDualHttpBinding_IMyervice");
    client.ClientCredentials.UserName.UserName = "username";
    client.ClientCredentials.UserName.Password = "bad password";
    client.ChannelFactory.Faulted += new EventHandler(ChannelFactory_Faulted);
    client.Open();   // This hangs for 01:00:00 minute

    // Doesn't reach here
    client.DoSomethingCompleted += new EventHandler<DoSomethingEventArgs(client_DoSomethingCompleted);
    client.DoSomethingAsync(param);
}
catch (Exception ex)
{
    // Enters here with a 'TimeoutException' exception
}

为什么客户不会触发我所拥有的'故障'方法?

为什么它等待来自服务的响应,即使服务在'CustomUserNameValidator'的'Validate'方法期间通过'FaultException'?

2 个答案:

答案 0 :(得分:2)

当然,您使用的代码似乎缺少代码行后面的3行:     client.ChannelFactory.Faulted += new EventHandler(ChannelFactory_Faulted);

但是,我还是在黑暗中拍摄,因为我还没有使用这个选项。

var local = client.ChannelFactory.CreateChannel();

((IClientChannel)local).Faulted += ChannelFaulted;

local.Open();

更好的是,根据此处提供的示例,open方法似乎没有必要:ChannelFactory

答案 1 :(得分:0)

我个人还没有使用过ChannelFactory.Faulted事件处理程序,但这里有一篇供您考虑的帖子:creating-wcf-channelfactory