0

我正在使用一个由 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"];

对于每个服务调用

是否有更通用的包罗万象的事件可以检测到对我的服务的调用?我承认不完全理解的许多 Behaviour/ChannelDispatcher 类型中的一种可能会触发其中的一种。

谢谢你的帮助,汤姆

4

1 回答 1

2

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

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

你可以在这里找到一个例子。

于 2011-03-17T13:36:58.933 回答