【问题标题】:Capture global WCF ServiceHost request events捕获全局 WCF ServiceHost 请求事件
【发布时间】:2011-03-17 21:36:58
【问题描述】:

我正在使用一个由 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 可以检测到对我的服务的调用?可能有一个被我承认不完全理解的许多 Behaviour/ChannelDispatcher 类型之一触发.

谢谢你的帮助,汤姆

【问题讨论】:

    标签: wcf servicehost rehosting


    【解决方案1】:

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

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

    你可以找到一个例子here

    【讨论】:

    • 是的!而已!好东西,你显然知道这一切。我最终并没有真​​正使用 IParameterInspector,而是 IDispatchMessageInspector.AfterReceiveRequest() 实现似乎可以解决问题。我只是在绑定返回适当处理的数据的事件后将其添加为行为。谢谢!
    • 很高兴它为你解决了。我使用IParameterInspector 来审核调用。
    猜你喜欢
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 2013-05-08
    • 2014-01-20
    相关资源
    最近更新 更多