C# 是否忽略.NET 2.0 Web服务WSDL错误元素?

C# 是否忽略.NET 2.0 Web服务WSDL错误元素?,c#,.net,web-services,wsdl,asmx,C#,.net,Web Services,Wsdl,Asmx,我有一个web服务方法,我想抛出一些自定义异常,例如SomeException、SomeOtherException等,然后web服务会将这些异常转化为SOAP错误,客户端可以处理这些错误。在Java中,我可以在wsdl中的wsdl:operation元素中包含wsdl:fault元素。NET似乎没有满足这一要求,也没有办法在WebMethod上添加属性来显示可能发生的SOAP错误 如果我创建了一个包含wsdl:fault元素的Java web服务,并向.NET项目添加了一个web引用,那么我希

我有一个web服务方法,我想抛出一些自定义异常,例如SomeException、SomeOtherException等,然后web服务会将这些异常转化为SOAP错误,客户端可以处理这些错误。在Java中,我可以在wsdl中的wsdl:operation元素中包含wsdl:fault元素。NET似乎没有满足这一要求,也没有办法在WebMethod上添加属性来显示可能发生的SOAP错误

如果我创建了一个包含wsdl:fault元素的Java web服务,并向.NET项目添加了一个web引用,那么我希望wsdl:fault元素能够像创建其他实体一样创建适当命名的异常,但情况似乎并非如此

是不是wsdl中的wsdl:fault元素被.NET完全忽略了?它们是在上定义的WSDL规范的一部分,因此这不是我所期望的行为

如果是这种情况,可能的解决方法是返回一个包含成功/失败布尔值和错误消息/枚举的结果对象。或者使用SoapExceptions。如果我选择使用SoapExceptions,那么我将把emphesis放在我的web服务的用户身上,以正确地处理这些异常并将其反序列化。这两种方法似乎都不是处理这个问题的好方法,并添加了额外的问题和代码来解决这个问题


有什么建议吗?

既然您要求.net 2.0,我想您知道这在WCF中是“固定”的,您可以添加属性[FaultContract(typeof(YourCustomException))]

正如您所说,在2.0中执行此操作的“正常”方式是,添加一条带有成功布尔值、结果和错误属性的响应消息


您通常可以在EntLib中看到这是如何完成的。

ASMX web服务在客户端或服务器上都不支持wsdl:fault元素。他们永远不会

如前所述,此错误修复程序称为“WCF”


我已经成功地手工编写了一个包含WSDL:fault元素的WSDL,然后通过asmxweb服务将故障消息作为SoapException的Detail属性返回这些故障。Java和WCF客户端正确地将此视为适当类型的例外。

您使用的是哪种类型的客户端?如果是浏览器中的Silverlight,那么在处理SOAP错误方面存在缺点。客户端是ASP.NET网站。是的,我一直在使用.NET 2,我在WCF中确实知道这一点,并希望有某种方法来实现[FaultContract(typeof(YourCustomException))]在我忽略的.NET 2中的SOAP web服务中,情况似乎并非如此。处理此问题的最佳方法似乎是遵循“成功布尔、结果和错误属性”的模式。谢谢。我已经看过了手工编写WSDL,以便其他使用WSDL:fault的客户机能够识别这些代码。但它确实让使用.NET实现的人无法了解异常情况,除非他们自己阅读了WDSL。知道ASMX web服务不支持WSDL中的fault元素很有用。我知道,如果我使用WCF,这不会是一个问题,但我目前无法做到这一点,因此我希望在.NET 2中找到一个解决方案,如标题所示。不,如果您的服务通过填写SoapException的Detail属性发送了一个正确的错误,那么即使是.NET 2.0客户端也会收到一个填写了Detail属性的SoapException。只是没有一个单独的例外为每个错误。是的,我知道有理由升级,但我不能在这个项目中使用它,不是我的决定。使用SoapException执行此操作需要客户端(如果它们是.NET之前的WCF)必须确定如何处理它们返回的详细XML。从中获取ExceptionType。是吗?是的。没错。我建议使用XML格式来显示异常类型。我根据“异常”使根元素唯一。这很有帮助。
[return: System.Xml.Serialization.XmlElementAttribute("ResultWS", typeof(ResultWS), Namespace = "http://...")]
[return: System.Xml.Serialization.XmlElementAttribute("ResultFaultWS", typeof(ResultFaultWS), Namespace = "http://...")]
public object SumTest_Operation([System.Xml.Serialization.XmlElementAttribute(Namespace = "http://...")] ParamWS param)
{            
    ResultWS result = null;
    try
    {
        result.Value = param.P1 + param.P2;              

    }
    catch (Exception)
    {
        ResultFaultWS resultFault = new ResultFaultWS();
        resultFault.Status = noOK;

        return resultFault;;
    }
    return result;
}