Dot-Net

如何從 ASP.NET 中的肥皂異常中提取內部異常?

  • May 17, 2015

我有一個像這樣的簡單 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屬性,有人可以幫忙嗎?如果可以避免,請不要建議解析.InnerException``HelloWorldException``Message``SoapException

不幸的是,我認為這是不可能的。

您在 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;
 }
}

引用自:https://stackoverflow.com/questions/32058