3

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

我在本地机器上使用控制台应用程序进行自我托管:

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() 时,您实际实现的服务逻辑就会发生。您可以根据需要更新拦截器以处理异常,包括 StopWatch 和日志参数,但这是基本思想。

我的示例向您展示了设置它的蛮力方式。“更清洁”的解决方案是使用 IoC 创建您的服务实例/代理,但这应该让您的代码立即执行您想要的操作。为了进一步阅读,这里是Castle 项目关于使用其 AOP 钩子的教程的链接:

于 2012-04-28T15:51:46.370 回答
0

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

If you are debugging you can just switch on WCF tracing. It will produce a very comprehensive log and there is a good free tool for viewing the log that comes as part of the Windows SDK - I presume when you say you can't use third party product it doesn't include built-in .Net and Windows SDK features...

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

于 2012-04-28T19:01:22.630 回答