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());
    }

私のキャッチブロックでは、実際の例外のメッセージを抽出してコードで使用したいと考えています。キャッチされた例外は aSoapExceptionです。これは問題ありませんが、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 ---

...そして、InnerExceptionですnull

私がやりたいのは、 (私のサンプルのテキスト)の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);    
}

1 つだけ - (サービス プロジェクトの) web.config で customErrors mode='RemoteOnly' または 'On' を設定する必要があります。

customErrors の発見に関するクレジット - http://forums.asp.net/t/236665.aspx/1

于 2012-09-05T12:33:40.673 に答える
2

私は少し前に似たようなことに出くわし、それについてブログに書きました。それが正確に適用できるかどうかはわかりませんが、そうかもしれません。MessageFault オブジェクトを通過する必要があることを理解すれば、コードは十分に単純です。私の場合、詳細に SOAP サービスを再クエリするために使用できる GUID が含まれていることはわかっていました。コードは次のようになります。

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