1

我有一个实现“自定义用户名密码验证器”的 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' 服务,它也会等待来自服务的响应?

4

2 回答 2

2

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

但是,由于我尚未使用此选项,因此我再次在黑暗中拍摄。

var local = client.ChannelFactory.CreateChannel();

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

local.Open();

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

于 2012-07-18T20:46:30.713 回答
0

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

于 2012-07-18T17:57:11.790 回答