如何捕获Web服务异常

时间:2012-07-17 00:35:35

标签: c# web-services exception

如何从返回自定义对象的Web Service中捕获异常?

我看过this帖子,但它似乎没有显示如何获取服务引发的异常。

我可以提取SOAP异常,但我希望能够获得Web服务返回的原始异常。我已经查看了此时设置的变量,似乎无法在任何地方看到异常,我只看到:

"Server was unable to process request. ---> Exception of type 
    'RestoreCommon.ConsignmentNotFoundException' was thrown."

    try
    {
        Consignment cons = WebServiceRequest.Instance.Service
            .getConsignmentDetails(txtConsignmentNumber.Text);
            lblReceiverName.Text = cons.Receiver.Name;
    }
    catch (ConsignmentNotFoundException)
    {
        MessageBox.Show("Consignment could not be found!");
    }

这可能吗?

1 个答案:

答案 0 :(得分:1)

简而言之,没有。

Web服务总是会引发SOAP错误。在您的代码中,

  1. MessageBox意味着在Windows窗体中使用,而不是其他任何地方。
  2. 您可以抛出此异常,并且在客户端应用程序中,您将不得不处理SOAP错误。
  3. 编辑:如果您不想将异常发送到客户端,请执行以下操作:

    class BaseResponse
        {
            public bool HasErrors
            {
                get;
                set;
            }
    
            public Collection<String> Errors
            {
                get;
                set;
            }
        }
    

    每个WebMethod响应都必须从此类继承。现在,这就是你的WebMethod块的样子:

    public ConcreteResponse SomeWebMethod()
            {
                ConcreteResponse response = new ConcreteResponse();
    
                try
                {
                    // Processing here
                }
                catch (Exception exception)
                {
                    // Log the actual exception details somewhere
    
                    // Replace the exception with user friendly message
                    response.HasErrors = true;
                    response.Errors = new Collection<string>();
    
                    response.Errors[0] = exception.Message;
                }
                finally
                {
                    // Clean ups here
                }
    
                return response;
            }
    

    这只是一个例子。您可能需要编写适当的异常处理代码,而不是简单地使用通用的catch块。

    注意:这将处理仅在您的应用程序中发生的异常。在客户端和服务之间的通信期间发生的任何异常仍将被抛出到客户端应用程序。