我被要求使用 WCF 实现一个 Web 服务,该服务将返回一个标准响应对象,该对象指示 Web 服务调用是成功还是失败,以及如果发生错误消息。
在我看来,这不是 WCF 的预期用途,对吗?
我的问题是,我正在使用 IDispatchMessageInspector.AfterReceiveRequest() 在 WCF 反序列化请求并调用我的操作之前根据 XSD 验证请求。
如果验证失败,我如何返回我的标准响应对象? WCF 似乎希望我在这种情况下抛出一个FaultException,但我希望该接口(interface)纯粹返回一个包含任何失败信息的标准响应对象。
因此,这意味着您需要定义一个自定义错误异常(当您收到的请求在反序列化等之前验证失败时可以抛出该异常),以及当请求成功时发送的第二个标准响应。这是正确的方法吗?
为了实现在发生验证错误等情况时简单地返回一个响应对象的目标,我一直在尝试作弊并在 AfterReceiveRequest() 中将请求对象设置为 null,以便它跳过请求的处理。
object IDispatchMessageInspector.AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
{
try
{
validateMessage(ref request);
}
catch (Exception e)
{
request = null;
return new FaultException<string>(e.Message);
}
return null;
}
然后也许我可以在 BeforeSendReply() 中创建自己的自定义响应对象。
void IDispatchMessageInspector.BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
if (correlationState != null)
{
reply = CreateMyOwnResponse(((FaultException) correlationState));
}
}
但我知道这看起来很愚蠢,并且不符合 WCF 最有可能的使用方式。有没有办法很好地实现我想要的,或者当事情变坏时我必须发送异常类型,而当事情成功时我必须发送不同的“正常”响应?
最佳答案
WCF 不会限制返回对象或强制您抛出异常来传达错误情况。这取决于您的需求以及您在架构的总体规模上达成的协议(protocol)。
在我的应用程序中,我总是倾向于使用 int
类型的返回参数,当发生错误时该参数为负值,而当操作成功完成时该参数为零。您还可以拥有更复杂的返回参数,其中包含错误结构,例如:
[DataContract]
public class ReturnValue
{
[DataMember]
public int ReturnCode;
[DataMember]
public string ResultingDescription;
// enum listing severities like Critical, Warning, etc.
[DataMember]
public Severity Severity;
}
如果您需要复杂的返回参数作为操作的返回,您可以使用以下签名:
[OperationContract]
ReturnValue MyOperation (int param1, string param2, out MyOperationResult result);
我的经验法则是:
仅针对意外和未处理的异常(您在开发时没有预料到的情况)越过服务边界抛出异常
对于所有其他情况,请使用操作的返回值返回错误代码(这方面也不异常(exception))
关于.net - 使用单个标准响应对象创建 WCF Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7551102/