我有一个实现'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'?
答案 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