关闭WCF SOAP Service for Maintenance并提供友好消息

时间:2010-07-12 16:17:01

标签: wcf soap service

我正在使用WCF托管一些SOAP服务。为了维护等目的,我如何通过配置关闭这些服务,并向服务消费者提供一个友好的消息,例如“您请求的服务因维护而停机。”?

3 个答案:

答案 0 :(得分:2)

你必须有第二个服务,提供相同的接口,相同的方法等,这些服务都会返回友好的消息而不是真实的结果。

当这些服务方法不只是返回一个字符串而是一个复杂的数据对象时,这可能会有点棘手 - 你把这个“友好”的消息放在哪里?

实际上我认为这不可能真的完成 - 因为您的服务通常不会被实际人员“看到”,您不能只提出app_offline.htm文件或类似内容。

尝试尽可能减少停机时间,例如在新端口上设置新版本的服务并在那里进行测试,直到您有足够的信心进行切换。

使用WCF,主要是围绕相应配置更新/复制的练习,因此您的服务永远不会在任何延长的时间内都无法使用(希望如此!)。

如果你真的必须,你能做什么,只是有一个替代服务,总是会抛出FaultContract<ServiceDownForMaintenance> - 但是所有打电话给你服务的客户都必须知道这个和他们< / strong>必须处理此案例并提供错误或信息消息。您的服务无法真正提供......

答案 1 :(得分:1)

如何:创建一个自定义ServiceBehavior来拦截我对服务的传入请求。然后,让自定义行为检查我的配置文件中的用户定义标志,如<add key="IsMyServiceUp" value="true" />,如果该值返回为false,则抛出一个ServiceException,其友好消息和HTTP代码为503 - 服务不可用。

听起来合理吗?然后,我所要做的就是更改配置文件中的标志,以指定服务的启动或停止位置。

答案 2 :(得分:0)

好的,所以我创建了一个实现IOperationBehavior的新自定义行为。在Validate方法中,我有

public void Validate(OperationDescription operationDescription)
    {
        bool isServiceUp = Boolean.Parse(ConfigurationManager.AppSettings["IsOrderServiceUp"].ToString());
        if (!isServiceUp)
        {
            throw new ServiceException(ServiceErrorCode.Generic_Server_Exception,
            ServiceErrors.Generic_Server_Exception,
            SoapFaultCode.Server);
        }
    }

其他已实施的方法ApplyClientBehaviorApplyDispatchBehaviorAddBindingParameters都是空的。

我用[ServiceStatusValidation]装饰了我的一个服务操作,这是我的自定义行为的类名。

当我启动服务并导航到具有此装饰的操作时,我不会得到我抛出的异常。 SOAP UI在响应窗格中没有显示任何内容,我的消费REST外观给出了一般400错误。异常消息是'服务器没有提供有意义的回复;这可能是由于合同不匹配,过早的会话关闭或内部服务器错误造成的。'。

有什么想法吗?我是否应该使用其他方法而不是Validate方法来实现此逻辑?