我正在使用WCF托管一些SOAP服务。为了维护等目的,我如何通过配置关闭这些服务,并向服务消费者提供一个友好的消息,例如“您请求的服务因维护而停机。”?
答案 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);
}
}
其他已实施的方法ApplyClientBehavior
,ApplyDispatchBehavior
和AddBindingParameters
都是空的。
我用[ServiceStatusValidation]
装饰了我的一个服务操作,这是我的自定义行为的类名。
当我启动服务并导航到具有此装饰的操作时,我不会得到我抛出的异常。 SOAP UI在响应窗格中没有显示任何内容,我的消费REST外观给出了一般400错误。异常消息是'服务器没有提供有意义的回复;这可能是由于合同不匹配,过早的会话关闭或内部服务器错误造成的。'。
有什么想法吗?我是否应该使用其他方法而不是Validate
方法来实现此逻辑?