c# - 从 ASMX Web 服务捕获自定义异常

标签 c# exception-handling asmx web-services

我有一个网络服务,我在其中创建了一个自定义异常。假设此异常的名称是 InvalidContractException。

我想做的是,如果发生特定步骤,我想抛出这个异常。但是,我无法弄清楚客户端如何捕获 InvalidContractException 以便正确处理它。

这是一个用 C# 编写的 ASP.Net Web 服务

最佳答案

你不能这样做:

  1. Web 服务处理 SOAP 故障。异常是特定于平台的。
  2. 当 ASMX 网络服务中的异常未得到处理时,.NET 会将其转换为 SOAP 错误。异常详情未序列化。
  3. 在 ASMX 客户端中,SOAP 错误将被转换为 SoapException。

ASMX 网络服务没有对​​ SOAP 故障的适当支持。除了客户端的 SoapException 之外,没有其他方法可以获取任何异常。

升级到 WCF 的另一个原因。


作为您不能使用 ASMX 执行的操作的示例,以下是 WCF 的工作原理。 WCF 允许您为每个 Web 服务操作指定它可以返回哪些错误:

[ServiceContract]
public interface IMyServiceContract
{
    [FaultContract(typeof(IntegerZeroFault))]
    [FaultContract(typeof(SomeOtherFault))]
    [OperationContract]
    public string GetSomeString(int someInteger);
}

[DataContract]
public class IntegerZeroFault
{
    [DataMember]
    public string WhichInteger {get;set;}
}

[DataContract]
public class SomeOtherFault
{
    [DataMember]
    public string ErrorMessage {get;set;}
}

public class MyService : IMyServiceContract
{
    public string GetSomeString(int someInteger)
    {
        if (someInteger == 0) 
            throw new FaultException<IntegerZeroFault>(
                new IntegerZeroFault{WhichInteger="someInteger"});
        if (someInteger != 42)
            throw new FaultException<SomeOtherFault>(
                new SomeOtherFault{ErrorMessage ="That's not the anaswer"});
        return "Don't panic";
    }
}

然后 WCF 客户端可以捕获 FaultException<SomeOtherFault> , 例如。当我用 Java 客户端尝试这个时,它能够捕获 SomeOtherFault ,由 IBM Rational Web Developer 创建以派生自 Java Exception类。

关于c# - 从 ASMX Web 服务捕获自定义异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1296679/

相关文章:

c# - ASMX 返回纯字符串

c# - Entity Framework - 在分离状态下保存对相关对象的更改

c# - 从word文件中提取图片

c# - 单元测试 - 排列测试项目无法访问的对象

C# LockBits 性能(int[,] 到 byte[])

entity-framework - 在 Entity Framework4 中捕获 Sql 异常?最佳实践是什么?

javascript - 如何捕获传递给 jQuery 的回调中抛出的异常?

php - PHP ErrorException创建需要很长时间

c# - WCF 到 ASMX 绑定(bind)返回大数据比标准 Web 引用慢得多

asp.net - asmx 网络服务不读取 postdata