0

我有一个 WCF 服务-客户端对。我们一直依赖于在客户端的工厂方法上调用 Open() 来确保在我们进行任何调用之前服务可用。就像是:

MyClient GetClient() 
{
    MyClient client = new MyClient();
    try
    {
        client.Open();
        return client;
    }
    catch(Exception)
    {
        //perform an (important) error-handling here
    }
}

这样,调用者代码将执行以下操作:

client = factory.GetClient();
client.CallMethodInTheService();

他们不需要担心错误处理。

当我们在 wshttpbinding 中将安全模式设置为 Windows 并将 clientCredentialType 设置为 Windows 时,这将起作用。client.Open() 将在服务不可用时抛出异常,因此错误处理代码将被执行。但是,现在我们在无法使用基于 Windows 凭据的安全性的环境中进行部署,因此我们将安全模式设置为无。但是,这会导致 client.Open() 在服务不可用时不再抛出异常,而我们遇到了一些问题,因为我们依赖于工厂的 catch 块中的这段代码。

当我们使用消息安全性而不是禁用安全性时,Open() 抛出异常的原因是什么?如果 security 设置为 none,我们如何执行类似的可用性检查?我认为在每个单独的调用中放置带有错误处理的 try catch 并不是一个好的解决方案。工厂方法是否有另一种方法可以在返回客户端对象之前检查服务的可用性?

4

1 回答 1

1

不会以任何安全性方式引发异常,但仅在涉及会话的情况下才会引发异常。例如,建立安全上下文=真或协商服务凭据=真(默认值)。在这些情况下,在第一次调用服务器之前,客户端将向它发送一些基础消息,以便决定要使用的密码密钥。当您调用 open() 时,您明确要求现在进行此协商(否则它将在第一次调用时发生)。如果您打开 Wcf 日志记录(或 Fiddler),您将看到这一点。

当服务不可用时,协商将失败,因此您会遇到异常。

没有安全性,就没有会话,所以也不例外。

我建议你在服务中添加一个 IsAlive 操作。

于 2012-04-18T17:49:55.777 回答