ELMAHを使用したWebサービスでの例外の取り扱い
-
24-09-2019 - |
質問
我々は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);
}
所属していません StackOverflow