WCF/REST 日志记录

3
我想知道有没有人能够向我展示如何记录来自我的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文件。
编辑:
我也不能使用任何第三方产品来完成此事。
2个回答

0
处理这个问题的一种常见方法是使用面向切面编程(AOP),并使用Castle Dynamic Proxy库。其思想是,您可以使用动态类装饰/代理服务实现,并拦截在您的服务上调用的每个方法。无论在服务上调用什么方法,它们都会被您的代理所“拦截”,然后发送到一个单独的方法中,您可以记录您想要的内容,然后完成原始调用。以下是一个快速示例:
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()时,您实际实现的服务逻辑将发生。您可以更新拦截器以处理异常,包括StopWatch和日志参数,但这是基本思想。

我的示例向您展示了设置此项的暴力方式。更“清洁”的解决方案是使用IoC创建您的服务实例/代理,但这应该可以让您的代码立即按照您想要的方式运行。有关更多阅读材料,请参阅Castle项目教程,了解如何使用其AOP钩子:


在您的日志拦截器类中,请务必包含using Castle.DynamicProxy - 请记住这是一个第三方库,所以如果您没有它,可以从NuGet获取或直接从Castle Project下载。同时,您还需要添加对“Castle.Core”和“Castle.Windsor”的项目引用。 - Rob S
啊,抱歉 Rob,我不能使用任何第三方产品。我没有在问题中提到这一点是我的错误。我现在会更新。 - G Gr

0
你是在谈论调试目的下的日志记录还是在实时服务监控方面?
如果你是在调试,你可以打开 WCF 跟踪。它会生成非常全面的日志,并且有一个很好的免费工具来查看日志,这个工具是 Windows SDK 的一部分 - 我假设当你说不能使用第三方产品时,不包括内置的 .Net 和 Windows SDK 功能...

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接