捕获全局WCF ServiceHost请求事件

时间:2011-03-17 13:25:55

标签: wcf servicehost rehosting

我正在使用一个由WPF应用程序托管的非常简单的WCF项目。它基本上作为REST服务器运行,用于在我的PC上发送数据。没有IIS,它作为SingleInstance运行。 我想知道哪些IP正在访问MyService,以及他们试图调用哪些WebMethod。

好的,我可以将一个事件作为我的服务的一部分,在服务类本身中声明。这里有一些代码可以实现,它完全按照预期工作(没有关于m_的火焰请);)

MyService ds = new MyService(); // It's not really called this :)
ds.Request += new EventHandler(ds_Request); // I want to avoid this
ds.SomePropertySetFromMyRehostingClient = "something"; // SingleInstance now required

m_Service = new ServiceHost(ds, new Uri(GetServerHostUri()));
m_Service.Description.Behaviors.Find<ServiceBehaviorAttribute>().InstanceContextMode = InstanceContextMode.Single;
m_Service.BeginOpen(new TimeSpan(0, 0, 5), new AsyncCallback(EndStartService), null);

然后在每个服务方法中,我可以举起此事件,以便我的应用知道某人已尝试使用它。很棒,但让我们面对现实,这太可怕了。

我必须写下以下内容:

var who =  OperationContext.Current.IncomingMessageProperties.Via;
var what = OperationContext.Current.IncomingMessageProperties["UriTemplateMatchResults"];

每次服务电话

是否有一个更通用的catch-all-event可以检测到对我的服务的调用?可能有一个被许多Behavior / ChannelDispatcher类型中的一个触发,我承认它们并不完全理解

谢谢你的帮助,汤姆

1 个答案:

答案 0 :(得分:2)

使用IParameterInspector,您可以挂钩任何方法调用并检查方法和/或参数。

除了您使用的消息之外,没有其他方法可以获取传入消息的额外信息(IP地址等)。这只是微软恕我直言的一个糟糕的设计(见我的咆哮here)。

您可以找到示例here