WCF/REST 日志记录

本文关键字:记录 日志 REST WCF | 更新日期: 2023-09-27 18:32:28

我想知道是否有人可以告诉我如何从我的 wcf rest 服务记录一个简单的请求/响应。

我在本地计算机上使用控制台应用程序自托管:

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文件。

编辑:

我也不能为此使用任何第三方产品。

WCF/REST 日志记录

您是在谈论用于调试目的的日志记录还是用于在实时服务中进行监视的日志记录?

如果要调试,只需打开 WCF 跟踪即可。它将生成一个非常全面的日志,并且有一个很好的免费工具用于查看作为Windows SDK一部分的日志 - 我认为当您说无法使用第三方产品时,它不包括内置的.Net和Windows SDK功能...

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

处理此问题的常用方法是使用 Castle 动态代理库的面向方面编程 (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 创建您的服务实例/代理,但这应该让您的代码立即执行您想要的操作。如需进一步阅读,这里是 Castle 项目关于使用其 AOP 钩子的教程的链接: