3

誰かが私のwcfRESTサービスからの簡単な要求/応答をログに記録する方法を教えてもらえないかと思っていました。

ローカルマシンでコンソールアプリケーションを使用してセルフホスティングしています。

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
            ServiceHost host = new ServiceHost(typeof(RawDataService), new Uri(baseAddress));
            WebHttpBinding binding = new WebHttpBinding();
            //binding.Security.Mode = WebHttpSecurityMode.Transport;
            host.AddServiceEndpoint(typeof(IReceiveData), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior());
            host.Open();
            Console.WriteLine("Host opened");
            Console.ReadLine();
        }
    }
}

必要なのはホスティングコンソールアプリに追加されたものだけだと本当に思っていました。私はこれをフォローしようとしましたが、少し混乱しましたhttp://blogs.msdn.com/b/carlosfigueira/archive/2011/04/19/wcf-extensibility-message-inspectors.aspx

app.configファイルやweb.configファイルを使用していないことに注意してください。

編集:

また、これにサードパーティ製品を使用することはできません。

4

2 に答える 2

0

これを処理する一般的な方法は、Castle Dynamic Proxyライブラリを使用したアスペクト指向プログラミング(AOP)を使用することです。アイデアは、サービスで呼び出されるすべてのメソッドをインターセプトする動的クラスを使用して、サービス実装を装飾/プロキシできるということです。サービスで呼び出されるメソッドに関係なく、それらはプロキシによって「インターセプト」され、必要なものをログに記録できる単一のメソッドに送信されてから、元の呼び出しを終了できます。これがどのように見えるかの簡単なサンプルです:

public class LoggingInterceptor : IInterceptor
{
    // No matter what service method is called, it's funneled through here.
    public void Intercept(IInvocation call)
    {
        MyLogger.Info("Starting call: " + call.Method.Name);

        // Actually invoke whatever method was originally called 
        call.Proceed();

        MyLogger.Info("Finished call: " + call.Method.Name);
    }
}

次に、すべてのメソッド呼び出しにこのインターセプターを使用するサービスクラスのプロキシを作成する必要があります。必要に応じてきれいに抽象化することができますが、これが基本的な要点です。

using Castle.DynamicProxy;
...

// Create your service object and then create a dynamic proxy of the object
// that will inject your logging interceptor logic.
ProxyGenerator generator = new ProxyGenerator();
RawDataService service = new RawDataService();
RawDataService proxy = generator.CreateClassProxyWithTarget<RawDataService>(
    service,
    new LoggingInterceptor());

// Register your proxy object, not the raw service w/ WCF
WebServiceHost host = new WebServiceHost(proxy, new Uri(baseAddress));
... rest of your code as it was ...

これで、RawDataServiceに対して行われたすべての呼び出しは、最初にIntercept()メソッドを通過し、Proceed()を呼び出すと、実際に実装されたサービスロジックが発生します。例外を処理するようにインターセプターを更新し、必要に応じてストップウォッチとログパラメーターを含めることができますが、それが基本的な考え方です。

私の例は、これを設定する強引な方法を示しています。「よりクリーンな」ソリューションは、IoCを使用してサービスインスタンス/プロキシを作成することですが、これにより、コードで今すぐ必要な処理を実行できるようになります。詳細については、AOPフックの使用に関するCastleプロジェクトのチュートリアルへのリンクを次に示します。

于 2012-04-28T15:51:46.370 に答える
0

デバッグ目的またはライブサービスでの監視のためのロギングについて話しているのですか?

デバッグしている場合は、WCFトレースをオンにするだけです。非常に包括的なログが生成され、Windows SDKの一部として提供されるログを表示するための優れた無料ツールがあります-サードパーティ製品を使用できないと言うと、組み込みの.Netが含まれていないと思いますおよびWindowsSDKの機能...

http://msdn.microsoft.com/en-us/library/ms733025.aspx

于 2012-04-28T19:01:22.630 に答える