5

私たちは 3 層アプリケーションに取り組んでおり、最新かつ最高のもの (MVC2、IIS7.5、WCF、SQL2k8 など) を使用することが許可されています。アプリケーション層は、WCF サービスによってさまざまな Web アプリケーションに公開されます。サービス側とクライアント側の両方を制御するため、HTTP よりもパフォーマンス上の利点がある net.tcp バインディングを使用することにしました。

Web アプリとサービスの両方で、エラー ログにELMAHを使用したいと考えています。これが私の質問です。WCF での ELMAH の使用に関する情報はたくさんありますが、すべて HTTP バインディングに関するものです。非 HTTP エンドポイントを公開する WCF サービスで ELMAH を使用できるかどうか、またはその方法を知っている人はいますか?

ELMAH は、web.config でAspNetCompatibilityEnabledフラグを true にする必要がある HttpContext を必要とするため、私の推測ではノーです。MSDNから:

IIS 7.0 と WAS により、WCF サービスは HTTP 以外のプロトコルを介して通信できます。ただし、ASP.NET 互換モードが有効になっているアプリケーションで実行されている WCF サービスは、HTTP 以外のエンドポイントを公開することは許可されていません。このような構成では、サービスが最初のメッセージを受信したときにアクティベーション例外が生成されます。

HTTP 以外のエンドポイントを持つ WCF サービスで ELMAH を使用できないことが本当である場合、フォローアップの質問は次のとおりです。HttpContext を必要としないような方法で ELMAH を使用できますか? または、より一般的に (薄い金属定規エラーをコミットしないように)、HTTP 以外のエンドポイントを持つ WCF サービスで ELMAH を使用する方法はありますか?

注: Elmah のソース コードをダウンロードして変更し、shim を追加したり、HttpContext の依存関係を削除したりできることは承知していますが、コードのフォークは避けたいと考えています。

4

4 に答える 4

5

いいえ。ELMAH は HTTP モジュールです。HTTP リクエストを処理しない限り、ELMAH は何もしません。

于 2010-05-31T05:35:34.727 に答える
2

以下のように可能です

Elmah.ErrorLog.GetDefault(null).Log(new Error(ex));

参照: http://groups.google.com/group/elmah/browse_thread/thread/9ea4b51420fd5dfa

以前に、AspNetCompatibility モードに加えて WCF サービスに対してこのソリューションを試してみましたが、IIS でホストされている WCF サービスでは機能しませんでしたが、Visual Studio 内の開発サーバーでホストされている WCF サービスでは機能していました。したがって、私は上記の解決策で満足しなければなりませんでした。

于 2010-06-11T05:27:07.047 に答える
0

static void AppInitialize() {} メソッドを使用して初期化しようとしましたか? WCF 関連のものを初期化するときに、非 HTTP エンドポイントで動作します。

詳細については、Wenlong Dong の優れたブログ投稿 ( http://blogs.msdn.com/b/wenlong/archive/2006/01/11/511514.aspx ) を参照してください。

HTH、

--larsw

于 2010-05-27T18:19:34.497 に答える
0

Enterprise Library Exception Handling ブロックを ELMAH と組み合わせて使用​​して、例外をログに記録します。HTTP モジュールを使用するのではなく、呼び出しログを ELMAH に直接利用します。

 public class ErrorHandlerServiceBehaviour : BehaviorExtensionElement, IServiceBehavior
    {
        #region BehaviourExtensionElement Members

        public override Type BehaviorType
        {
            get { return typeof(ErrorHandlerServiceBehaviour); }
        }

        protected override object CreateBehavior()
        {
        return new ErrorHandlerServiceBehaviour();
    }

    #endregion

    #region IServiceBehavior Members

    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
    {
    }

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        foreach (ChannelDispatcher channelDispatcher in serviceHostBase.ChannelDispatchers)
        {
            channelDispatcher.ErrorHandlers.Add(new ElmahExceptionHandler());
        }
    }

    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
    }

    #endregion

}

次に、ExceptionHandler

 public class ElmahExceptionHandler : IErrorHandler
    {
        #region IErrorHandler Members

        public bool HandleError(Exception error)
        {
            return ExceptionPolicy.HandleException(error, "ServiceExceptions");
        }

        public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {

        }

        #endregion
    }

次に、app.config のエンタープライズ ライブラリの例外ポリシー セクションで

<exceptionHandling>
    <exceptionPolicies>    
    <add name="ServiceExceptions">
        <exceptionTypes>
          <add type="System.Exception, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
            postHandlingAction="NotifyRethrow" name="Exception">
            <exceptionHandlers>
              <add type="DB.Framework.Logging.ElmahExceptionHandler, DinguBlue.Framework.Logging"
                name="Elmah Exception Handler" />
            </exceptionHandlers>
          </add>
        </exceptionTypes>
      </add>
    </exceptionPolicies>    
</exceptionHandling>

たとえば、http://dotnetslackers.com/articles/aspnet/Getting-ELMAH-to-work-with-WCF-services.aspxを参照してください。

于 2011-02-08T01:01:23.220 に答える