6

私は次のサービスを書きました:

namespace WebService1
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class Service1 : System.Web.Services.WebService
    {
        [WebMethod]
        public string Test(string str)
        {
            if (string.IsNullOrEmpty(str))
                throw new SoapException("message", SoapException.ClientFaultCode);
            else
                return str;
        }
    }
}

Testそしてそれをテストするための基本的なアプリケーション(クリックイベントでメソッドを呼び出す1つのボタン):

private void button1_Click(object sender, EventArgs e)
{
    ServiceReference1.Service1SoapClient ws = new WindowsFormsApplication1.ServiceReference1.Service1SoapClient();

    try
    {
        ws.Test("");
    }
    catch (SoapException ex)
    {
         //I never go here
    }
    catch (FaultException ex)
    {
        //always go there
    }
    catch (Exception ex)
    {

    }
}

WebServiceによってスローされたものをキャッチしたいのですSoapExceptionが、常にFaultExceptionキャッチブロックに移動してメッセージとして取得します。

System.Web.Services.Protocols.SoapException:[...] WebService1 \ WebService1 \ Service1.asmx.cs:line 25のWebService1.Service1.Test(String str)でのメッセージ

どうすれば本物を捕まえることができSoapExceptionますFaultExceptionか?Webサービスで見逃しているものはありますか?

4

2 に答える 2

7

主な「問題」は、ASP.NET Webサービス(.asmx)に接続するWCFサービスリファレンスを使用していることだと思います。

これを処理する「最も簡単な」方法は、クライアントでWCFサービス参照の代わりにWeb参照を使用することです。これを行うには、[サービス参照の追加]ダイアログの下部にある[詳細設定]ボタンを選択してから、その画面の下部にある[Web参照の追加]を選択します。Web参照を使用すると、SoapExceptionが発生するはずです。

正しい方法(Microsoftのアドバイスに従う場合)は、.asmxサービスの代わりにWCFサービスを公開することです。しかし、それはまったく別の章です。

于 2011-02-17T13:59:29.183 に答える
5

ASMXサービスが。をスローするSoapExceptionと、.NETはSOAP障害メッセージを返します。

タイプの例外として、SOAP障害がサービス参照に返されますFaultException。したがって、が表示されることはありませんSoapException

于 2011-02-17T14:45:22.687 に答える