关闭WCF SOAP服务进行维护并提供友好消息
我正在用WCF托管一些SOAP服务。我如何才能通过配置关闭这些服务以进行维护等,并向服务消费者提供友好的消息,例如“您请求的服务已停止维护。”?您必须拥有第二个服务,该服务提供相同的接口、相同的方法等。,这一切都会返回友好的信息,而不是真正的结果 当这些服务方法不仅返回字符串,而且返回复杂的数据对象时,这可能会变得有点棘手-您将“友好”消息放在哪里 事实上,我认为这是不可能做到的——因为你的服务通常不会被实际的人“看到”,所以你不能仅仅建立一个关闭WCF SOAP服务进行维护并提供友好消息,wcf,soap,service,Wcf,Soap,Service,我正在用WCF托管一些SOAP服务。我如何才能通过配置关闭这些服务以进行维护等,并向服务消费者提供友好的消息,例如“您请求的服务已停止维护。”?您必须拥有第二个服务,该服务提供相同的接口、相同的方法等。,这一切都会返回友好的信息,而不是真正的结果 当这些服务方法不仅返回字符串,而且返回复杂的数据对象时,这可能会变得有点棘手-您将“友好”消息放在哪里 事实上,我认为这是不可能做到的——因为你的服务通常不会被实际的人“看到”,所以你不能仅仅建立一个app\u offline.htm文件或诸如此类的东
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
方法中执行此逻辑?您编辑了您的答案以添加故障契约,因此我删除了我的,但我想添加一条注释:尽管我同意让公共服务“停机维护”不是件简单的事