Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 捕获ASP.NET WebService上WebMethod引发的自定义异常_C#_Asp.net_Web Services_Exception - Fatal编程技术网

C# 捕获ASP.NET WebService上WebMethod引发的自定义异常

C# 捕获ASP.NET WebService上WebMethod引发的自定义异常,c#,asp.net,web-services,exception,C#,Asp.net,Web Services,Exception,我有一个经典的asp.net web服务(asmx)和一个web方法。在我的web方法中,我需要为某些情况抛出一个自定义异常,并且我需要捕获调用web服务方法的特定自定义异常 [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class WebService : System.Web.Services.WebSer

我有一个经典的asp.net web服务(asmx)和一个web方法。在我的web方法中,我需要为某些情况抛出一个自定义异常,并且我需要捕获调用web服务方法的特定自定义异常

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService
{
    [WebMethod]
    public HelloWorldOutput HelloWorld(HelloWorldInput input)
    {
        try
        {
            // My Code
            return new HelloWorldOutput();
        }
        catch (Exception ex)
        {
            throw new HelloWorldException("Hello World Exception", ex);
        }
    }
}
输入、输出和异常类作为示例:

public class HelloWorldInput { }
public class HelloWorldOutput { }    

[Serializable]
public class HelloWorldException : Exception
{
    public HelloWorldException() { }
    public HelloWorldException(string message) : base(message) { }
    public HelloWorldException(string message, Exception inner) 
        : base(message, inner) { }
    protected HelloWorldException(
      System.Runtime.Serialization.SerializationInfo info,
      System.Runtime.Serialization.StreamingContext context)
        : base(info, context) { }
}
在客户端,我需要:

public static void Main()
{
    WebService service = new WebService();
    try
    {
        service.HelloWorld(new HelloWorldInput());
    }
    catch (HelloWorldException ex)
    {
        // Do sth with HelloWorldException
    }
    catch (Exception ex)
    {
        // Do sth with Exception
    }
}
但是,我不能这样做,因为当我在客户机上添加web服务引用时,我有服务类、输入和输出类,但没有自定义异常类

另一个问题是,我在序列化异常类方面也有问题(因为Exception.Data属性实现IDictionary接口)

有没有一种方法可以用我的方式做到这一点,或者我完全错了,或者我错过了web服务的基础知识

谢谢。

可能会有所帮助。看起来您将得到一个SoapException,但是您可以检查详细信息以确定它是否属于您的类


请注意,要访问“HelloWorldException”,您可以将其拉到单独的程序集中,并将其部署到客户端上

ASP.NET Web服务可以引发任何类型的异常:SoapException、HelloWorldException或soever。但是,异常被序列化为SOAP Fault元素,并且无论服务中抛出的异常类型如何,在反序列化时,异常都会转换为SoapException。因此,即使我将HelloWorldException部署到客户端,也不可能用我的catch块捕获HelloWorldException

对于ASP.NET客户端,唯一的方法是将异常捕获为SoapException,并通过其
Actor
SoapFaultSubCode
属性处理它

我基本上解决了以下问题:

网络服务:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService
{
    [WebMethod]
    public HelloWorldOutput HelloWorld(HelloWorldInput input)
    {
        try
        {
            // My Code
            return new HelloWorldOutput();
        }
        catch (Exception ex)
        {
            throw new SoapException("Hello World Exception",   
                 SoapException.ServerFaultCode, "HelloWorld", ex);
        }
    }
}
客户:

public static void Main()
{
    WebService service = new WebService();
    try
    {
        service.HelloWorld(new HelloWorldInput());
    }
    catch (SoapException ex)
    {
        if(ex.Actor == "HelloWorld")
            // Do sth with HelloWorldException
    }
    catch (Exception ex)
    {
        // Do sth with Exception
    }
}
以及布莱斯·菲舍尔在回答中所写的文件;这些msdn文档还提供了有关引发和处理web服务异常的有用信息


你分享的链接对布莱斯很有帮助。谢谢这有助于我了解web服务异常的行为。但是,对我来说,将异常类部署到客户端将是一个较晚的选择。我会考虑一下这个问题。非常感谢。您需要在web.config中设置customErrors mode='RemoteOnly'或'On'