谁在调用我的WebService?

时间:2009-11-24 16:38:06

标签: asp.net logging web-services

我有一个位于内部服务器上的Web服务。它可以从我们网络上的任何网站调用。

越来越多的开发人员开始使用它。当前可能有20多页使用此服务,而且这个数字正在快速增长。我可以看到一年后,有人询问使用此服务的页面以及使用的方法。

我想在请求进入时记录使用我的Web服务的页面的URL。 知道他们调用的方法也很好。我需要以这样的方式做一些事情,它不会影响客户端网站。我首先想到的是我可以在global.asax中编写一些代码。 / p>

我已经在Application_BeginRequest中添加了一些代码来记录请求对象的详细信息,但似乎没有关于请求URL的任何内容。

我错过了什么?我应该看一个不同的对象吗?

感谢。

5 个答案:

答案 0 :(得分:3)

在不破坏现有用户的情况下,这将很困难。 httpContect.Current.RequestUrl将只返回用于调用Web服务的URL,而不是返回调用它的Web页面。

在不中断现有应用程序并强制开发人员更改它们的情况下,您最接近的方法是获取HttpContext.Current.Request.UserHostAddress,这样您至少可以获取调用您服务的计算机的IP。

除此之外,您可能需要考虑的是为“CallingApp”的函数添加一个参数,然后在代码中记录该参数。这就是我们一旦意识到我们需要知道哪些应用程序正在调用我们的服务而做的事情。我们实际上有一个应用程序监视服务,它为我们开发的每个新应用程序使用GUID,并将该GUID传递给任何Web服务。这是一项额外的工作,但对我们来说这很重要,因为它可以让我们知道在我们需要执行更新时将会影响哪些应用程序,或者将应用服务器关闭以进行维护。

编辑 - 已添加<​​/ em>

作为旁注,在我们意识到我们需要跟踪这一点时,我们已经使用Web服务大约一年了。当遇到同样的问题时,我们创建了一组新的Web服务,并在所有新服务中包含了调用应用程序的额外字段,然后慢慢返回并将旧程序更改为指向新服务。 / p>

回想起来,我们希望我们知道我们需要预先做到这一点因为它创造了许多额外的工作。如果你真的想确切地知道谁在给你的服务打电话,我猜你会面对类似的事情。

答案 1 :(得分:2)

您唯一可以从消费者那里检索的是IP地址,而无需更改您的界面。

如果你可以改变它,你可以这样做,例如通过添加身份验证和记录谁正在调用什么,或通过一些简单的“令牌”原则。

但是这两种方法都要求您更改界面,从而打破向后兼容性 - 这是您永远不应该做的。

通过始终确保后向和前向兼容性,您不需要确切地知道谁在调用您的服务,而只需知道它实际上是在使用它。

答案 2 :(得分:1)

@David Stratton

感谢您的帮助。我认为你的建议很棒。在你的回答给了我一些新想法后,我确实做了一些非常不同的事情。

我应该提到我正在生成我的大多数用户用来对我的Web服务进行调用的Web代理。我的客户端通常不使用Visual Studio创建的代理。

这是做了什么:

我再次生成了我的Web代理客户端,并在每次调用之前添加了调用以记录客户端的httpcontext。因为代理在客户端上运行,所以他可以访问我需要的所有内容。这使我能够记录关于客户端和他们正在进行的特定呼叫的所有信息。我意识到这对大多数情况都不适用。但我的所有客户都是内部网站。

它的优点还在于客户端根本不需要修改代码。我刚刚给了他们一个新的DLL。问题解决了。我得到了我想要的所有跟踪数据,他们不必修改他们的代码。

我一直试图从网络服务的角度解决问题。

我意识到这个实现中还有一个整体,因为有人不必使用我的客户端代理来调用我的服务。我想我可以在将来的某个时候强制这样做。目前,他们可以让Visual Studio为我的服务创建一个Web代理。但是,如果他们这样做我想我不在乎。这不是调用我的服务的推荐方法。我认为唯一这样做的是ASP.NET 1.1网站。升级后,他们可能会切换到我生成的代理。

答案 3 :(得分:0)

如果没有实施某种身份验证,则无法确切知道谁正在调用您的服务 - 网络指标是衡量哪些流量达到您的服务的唯一方式。

我相信你已经知道了这一点,但网络服务的重点并不在于知道或关心谁在调用它。

答案 4 :(得分:0)

我已经成功使用了......

Dim strReferrer As String = HttpContext.Current.Request.UrlReferrer.AbsoluteUri

获取调用我的WEB API 2 Web服务的调用页面。