.net - 使用单个标准响应对象创建 WCF Web 服务

标签 .net wcf web-services error-handling xml-validation

我被要求使用 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);

我的经验法则是:

  1. 仅针对意外和未处理的异常(您在开发时没有预料到的情况)越过服务边界抛出异常

  2. 对于所有其他情况,请使用操作的返回值返回错误代码(这方面也不异常(exception))

关于.net - 使用单个标准响应对象创建 WCF Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7551102/

相关文章:

c# - Silverlight 启用的 WCF 服务与 Web 服务与 ADO.NET 数据服务

web-services - Web 服务添加/更新组合 Prestashop

java - Liferay json网络服务: url access not working?

c# - 如何将 IQueryable<string> 转换为字符串?

c# - 如何连接到 .NET 框架内的 MySQL 数据库?

c# - 将 Selenium 用于 Java 与 .NET 应用程序的优点/缺点是什么?

.net - 如何克隆 .NET 解决方案?

WCF 使用 Windows 服务

c# - Web 服务不再适用于单元测试/客户端代理创建

java - Axis2 生成的服务创建错误的请求