代码之家  ›  专栏  ›  技术社区  ›  LeJeune

SOAP-Webservice错误-设计实践

  •  4
  • LeJeune  · 技术社区  · 16 年前

    [WebMethod]
    public List<someClass> GetList(String param1)
    {
    }
    

    我应该吗

    • 抛出异常。让SOAP基础结构生成一个SOAP错误——调用者必须尝试/捕获。这对打电话的人来说不是很清楚
      1. 查看返回的SOAP数据包,我看到生成的响应如下所示

     <GetListResponse>
       <GetListResult>
         ...
         ...   
     </GetListResult>
    </GetListResponse> 
    

    我们是否可以改变返回包,以便在出错时将“GetListResult”元素更改为“GetListError”

    • 还有别的办法吗?

    谢谢!

    4 回复  |  直到 16 年前
        1
  •  2
  •   Guy Starbuck    16 年前

    最合适的SOA模式可能是错误契约,它本质上是封装在SOAPException中的数据契约。

    我在.NET中发布了一些示例,因为它看起来就是您正在使用的(这就是我所知道的:)

    在WCF中,您可以定义DataContract,然后使用“FaultContract”属性修饰OperationContract接口,该属性将其指定为返回值:

    public partial interface MyServiceContract
    {
        [System.ServiceModel.FaultContract(typeof(MyService.FaultContracts.ErrorMessageFaultContract))]
        [System.ServiceModel.OperationContract(...)]
        ResponseMessage SOAMethod(RequestMessage request) {...}
    }
    

    对于asmxweb服务(就像您在代码段中使用的那样),您不能使用此属性或设置。因此,要实现该模式,您需要:

    • 将序列化的ErrorData类附加到SoapException类:

      SoapException mySoapException = new SoapException(message, SoapException.ServerFaultCode, "", serialzedErrorDataClass);
      
    • 在代码中抛出SoapException

    似乎有很多工作要做,但通过这种方式,您可以完全控制返回的数据。顺便说一句,这是 ServiceFactory 来自Microsoft针对ASMX web服务的模式和实践。

        2
  •  1
  •   Jeremy Stein    16 年前
        3
  •  1
  •   John Saunders    16 年前

    您可以使正确的错误从旧的ASMX服务返回,但这并不容易。首先,您必须手工编写WSDL,因为ASMX基础设施永远不会在WSDL中创建错误元素。然后,您必须将所需的故障数据序列化到一个xmlement中,然后将该元素作为SoapException的Detail属性提供给抛出的SoapException。

    使用WCF更容易。您可以为每个操作声明多个faultcontract,WCF将生成正确的WSDL来引用它们。然后简单地抛出FaultException,其中类型T是FaultContract的类型。将T实例传递给构造函数,就可以了。

        4
  •  0
  •   skaffman    16 年前

    诀窍是说服web服务堆栈将异常(这是编写业务逻辑的“正确”方式)转换为正确编排的错误细节。我帮不了你。