質問

我々はASP.NETのWebサイトでそれを行うようELMAHを使用して、通常のASP.NET Webサービス(ASMX)でハンドル例外をグローバルにする方法はありますか?

役に立ちましたか?

解決

ASP.NET Webサービスは決して火災Application_Errorイベントと例外がASP.NETアプリケーションのようにELMAHによってグローバルに処理することはできません。しかし、我々は「手動」ELMAHを使用して例外をログに記録することができます:


public int WebServiceMethod() {
  try {
   ...
  }
  catch (Exception ex) {
    Elmah.ErrorLog.GetDefault(
      HttpContext.Current).Log(new Elmah.Error(ex, HttpContext.Current));
  }
}

他のヒント

あなたはこれを行うには、のSoapExtensionを使用することができます:

using System;
using System.Web.Services.Protocols;

namespace MyNamespace
{
    class ELMAHExtension : SoapExtension
    {
        public override object GetInitializer(Type serviceType)
        { return null; }

        public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
        { return null; }

        public override void Initialize(object initializer)
        { }

        public override void ProcessMessage(SoapMessage message)
        {
            if (message.Stage == SoapMessageStage.AfterSerialize &&
                message.Exception != null)
            {
                // Log exception here
            }
        }
    }
}

あなたが次の行にweb.configファイルでこれを登録します:

<system.web>
  <webServices>
    <soapExtensionTypes>
      <add type="MyNamespace.ELMAHExtension, MyDLL" priority="1" group="1" />
    </soapExtensionTypes>
  </webServices>
</system.web>

これは、あなたがあなたが呼ばれていたものについて、必要なすべての詳細を与えるべきであるのHttpContextとするSOAPMessageオブジェクトにアクセスできるようになります。私はあなたがこの段階で取得例外は常にthrows SOAPException指定になると思うし、それはあなたに興味を持っているビットは、おそらく内部例外です。

あなたはこのコードを使用することができます。

 try{
// your code in here
}
     catch (Exception ert)
            {
                Elmah.ErrorSignal.FromCurrentContext().Raise(ert);

            }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top