关闭WCF SOAP服务进行维护并提供友好消息

关闭WCF SOAP服务进行维护并提供友好消息,wcf,soap,service,Wcf,Soap,Service,我正在用WCF托管一些SOAP服务。我如何才能通过配置关闭这些服务以进行维护等,并向服务消费者提供友好的消息,例如“您请求的服务已停止维护。”?您必须拥有第二个服务,该服务提供相同的接口、相同的方法等。,这一切都会返回友好的信息,而不是真正的结果 当这些服务方法不仅返回字符串,而且返回复杂的数据对象时,这可能会变得有点棘手-您将“友好”消息放在哪里 事实上,我认为这是不可能做到的——因为你的服务通常不会被实际的人“看到”,所以你不能仅仅建立一个app\u offline.htm文件或诸如此类的东

我正在用WCF托管一些SOAP服务。我如何才能通过配置关闭这些服务以进行维护等,并向服务消费者提供友好的消息,例如“您请求的服务已停止维护。”?

您必须拥有第二个服务,该服务提供相同的接口、相同的方法等。,这一切都会返回友好的信息,而不是真正的结果

当这些服务方法不仅返回字符串,而且返回复杂的数据对象时,这可能会变得有点棘手-您将“友好”消息放在哪里

事实上,我认为这是不可能做到的——因为你的服务通常不会被实际的人“看到”,所以你不能仅仅建立一个
app\u offline.htm
文件或诸如此类的东西

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

对于WCF,它主要是围绕适当的配置进行更新/复制,因此您的服务在任何延长的时间内都不应该真正不可用(希望如此!)


如果您真的必须这样做,您可以做的就是提供一个替换服务,该服务将始终抛出一个
FaultContract
——但是所有调用您的服务的客户都必须知道这一点,并且他们必须处理此情况并提供错误或信息消息。您的服务不能真正提供…

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

当这些服务方法不仅返回字符串,而且返回复杂的数据对象时,这可能会变得有点棘手-您将“友好”消息放在哪里

事实上,我认为这是不可能做到的——因为你的服务通常不会被实际的人“看到”,所以你不能仅仅建立一个
app\u offline.htm
文件或诸如此类的东西

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

对于WCF,它主要是围绕适当的配置进行更新/复制,因此您的服务在任何延长的时间内都不应该真正不可用(希望如此!)


如果您真的必须这样做,您可以做的就是提供一个替换服务,该服务将始终抛出一个
FaultContract
——但是所有调用您的服务的客户都必须知道这一点,并且他们必须处理此情况并提供错误或信息消息。您的服务无法真正提供…

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


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

如何:创建自定义ServiceBehavior以拦截我对服务的传入请求。然后,让自定义行为检查我的配置文件中的用户定义标志,类似于
,如果该值返回为
false
,则抛出一个ServiceException,其中包含我的友好消息和HTTP代码503-服务不可用


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

好的,因此我创建了一个新的自定义行为来实现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);
        }
    }
其他实现的方法
ApplyClientBehavior
ApplyDispatchBehavior
AddBindingParameters
都是空的

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

当我启动服务并导航到带有此装饰的操作时,我没有得到我抛出的异常。SOAP UI在响应窗格中没有显示返回的任何内容,我的REST facade提供了一个通用的400错误,异常消息是“服务器没有提供有意义的回复;这可能是由协定不匹配、会话过早关闭或内部服务器错误造成的。“


有什么想法吗?我是否应该在我没有实现的其他方法中执行此逻辑,而不是使用
Validate
方法?

好的,因此我创建了一个新的自定义行为来实现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);
        }
    }
其他实现的方法
ApplyClientBehavior
ApplyDispatchBehavior
AddBindingParameters
都是空的

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

当我启动服务并导航到带有此装饰的操作时,我没有得到我抛出的异常。SOAP UI在响应窗格中没有显示返回的任何内容,我的REST facade提供了一个通用的400错误,异常消息是“服务器没有提供有意义的回复;这可能是由协定不匹配、会话过早关闭或内部服务器错误造成的。“


有什么想法吗?我是否应该在我没有实现的其他方法中,而不是在
Validate
方法中执行此逻辑?

您编辑了您的答案以添加故障契约,因此我删除了我的,但我想添加一条注释:尽管我同意让公共服务“停机维护”不是件简单的事