15

我有一个像这样的简单 Web 服务操作:

    [WebMethod]
    public string HelloWorld()
    {
        throw new Exception("HelloWorldException");
        return "Hello World";
    }

然后我有一个使用 Web 服务然后调用操作的客户端应用程序。显然它会抛出一个异常:-)

    try
    {
        hwservicens.Service1 service1 = new hwservicens.Service1();
        service1.HelloWorld();
    }
    catch(Exception e)
    {
        Console.WriteLine(e.ToString());
    }

在我的捕获块中,我想做的是提取实际异常的消息以在我的代码中使用它。捕获的异常是 a SoapException,这很好,但它的Message属性是这样的......

System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.Exception: HelloWorldException
   at WebService1.Service1.HelloWorld() in C:\svnroot\Vordur\WebService1\Service1.asmx.cs:line 27
   --- End of inner exception stack trace ---

...而且InnerExceptionnull

我想做的是提取(我的示例中的文本)的Message属性,有人可以帮忙吗?如果可以避免,请不要建议解析.InnerExceptionHelloWorldExceptionMessageSoapException

4

3 回答 3

6

不幸的是,我认为这是不可能的。

您在 Web 服务代码中引发的异常被编码为 Soap Fault,然后将其作为字符串传递回您的客户端代码。

您在 SoapException 消息中看到的只是来自 Soap 故障的文本,它没有被转换回异常,而只是存储为文本。

如果您想在错误条件下返回有用的信息,那么我建议从您的 Web 服务返回一个自定义类,该类可以具有包含您的信息的“错误”属性。

[WebMethod]
public ResponseClass HelloWorld()
{
  ResponseClass c = new ResponseClass();
  try 
  {
    throw new Exception("Exception Text");
    // The following would be returned on a success
    c.WasError = false;
    c.ReturnValue = "Hello World";
  }
  catch(Exception e)
  {
    c.WasError = true;
    c.ErrorMessage = e.Message;
    return c;
  }
}
于 2008-08-28T15:03:21.397 回答
5

可能的!

服务操作示例:

try
{
   // do something good for humanity
}
catch (Exception e)
{
   throw new SoapException(e.InnerException.Message,
                           SoapException.ServerFaultCode);
}

使用服务的客户端:

try
{
   // save humanity
}
catch (Exception e)
{
   Console.WriteLine(e.Message);    
}

只有一件事 - 您需要在 web.config(服务项目的)中设置 customErrors mode='RemoteOnly' 或 'On' 。

关于 customErrors 发现的学分 - http://forums.asp.net/t/236665.aspx/1

于 2012-09-05T12:33:40.673 回答
2

不久前我遇到了类似的事情,并在博客上写过。我不确定它是否完全适用,但可能是。一旦意识到必须通过 MessageFault 对象,代码就足够简单了。就我而言,我知道详细信息包含一个 GUID,我可以使用它来重新查询 SOAP 服务以获取详细信息。代码如下所示:

catch (FaultException soapEx)
{
    MessageFault mf = soapEx.CreateMessageFault();
    if (mf.HasDetail)
    {
        XmlDictionaryReader reader = mf.GetReaderAtDetailContents();
        Guid g = reader.ReadContentAsGuid();
    }
}
于 2008-08-28T22:13:05.013 回答