0

我正在创建一个使用 3rd 方 API(Web 服务)作为数据源的 ASP.NET MVC 网站。它是只读的,迄今为止,个人使用桌面应用程序(大多数在 C# 中)都可以访问它。我想通过网站使用这个 API,以便集中信息并为用户提供历史信息,自动执行某些重复性任务,并更轻松地允许用户之间共享信息。

今天的桌面客户端会遇到限制,如果您使用客户端向 API 发出重复请求,您的 IP 将被限制和/或禁止。我认为如果我从我的网站向 API 发出请求,它的 IP 将在它看到任何重大用途的那一刻被禁止。

假设我无法与 API 所有者一起解决问题。解决此问题的最简单方法可能是使用 AJAX 进行所有 API 访问。当用户访问该网站时,他使用 AJAX 向 API 发出请求,然后转身将它们发布到我的网站。我不喜欢这个想法有多种原因——首先,它会很慢,其次,我不能保证发送到我网站的数据是真实的。无论出于何种原因,恶意用户都可能向我发送不良信息。

所以我认为一个更好的主意是建立一个中间人。用户仍将被迫发出 AJAX 请求,但他们会将其发送到代理或我控制的其他东西,然后将其转发到真正的 API 并拦截响应,因此我可以更加确定我检索到的数据是真实的。

是否可以创建这样的“代理”?它会带来什么?我想使用 .NET 技术来实现,但我对任何想法都持开放态度。

编辑:似乎我使用“代理”这个词引起了混淆。我不想要代理,我想要的是允许我拦截来自 API 的响应的传递。我可以让客户端发出请求然后上传它,但我不想信任客户端,我想信任 API。

让我用简短的形式解释一下。用户机器上有一个客户端,它可以向 API 发出请求以获取当前信息。我想创建一个做同样事情的网站,但我正在考虑 API Web 服务可能会注意到,虽然以前它收到来自十个不同 IP 的十个用户的十个请求,但现在它收到十个请求十个来自一个 IP 的用户并阻止该 IP 将其视为机器人,即使每个请求都是由用户请求启动的,就像以前一样。解决此问题的最简单方法是让用户提出请求,然后将响应上传给我,但如果我这样做,我将被迫盲目地接受来自客户端的数据,这对于任何网站在任何情况下都是一个巨大的禁忌. 相反,如果我可以放置一些东西,将请求转发到保留用户 IP 的 API,但也能够拦截响应,从而证明数据是权威的,那将是首选。但是,我想不出一种软件机制来做到这一点——似乎需要在不同的层上完成。

至于法律问题,这是一个广泛使用的 API,有许多应用程序和用户(我发现还有其他网站使用该 API),但除了 API 技术中的论坛帖子之外,我无法找到任何法律信息,例如服务条款支持部分相当于“不要重复请求,遵守我们的缓存指令”等。我找不到任何表明这是非法或不正确使用 Web 服务的内容。

4

1 回答 1

1

你可以实现你的代理。不过,它不需要是 AJAX,如果您愿意,它可以只是一个显示 API 结果的普通网页请求。

无论哪种方式,在 .Net 中,您都可以使用 ASP.Net MVC 来完成。如果您想要 AJAX,请使用实现源 API 的 Web API 控制器操作,如果您想要网页,只需使用常规 MVC 控制器/操作。

在您的控制器内部,您只需通过参数向源发出 Web 请求。

为了避免限制,您可以缓存您从服务器发出的每个请求的结果(使用普通的 ASP.Net 缓存),这样如果另一个客户端尝试发出相同的请求,或者类似的请求,您可以返回缓存的结果,而不是向 API 发出另一个请求。

您必须确定应将结果缓存多长时间,具体取决于数据需要在客户端中保持多长时间。例如,对于天气数据,缓存一个小时似乎没问题。对于更快速移动的数据,它必须更少。您必须在避免节流和保持数据新鲜之间取得平衡。

您还可以在每次请求时智能地获取比您需要的更多的数据,然后过滤您返回给客户端的结果集。这可以为您提供更好的缓存命中率。

于 2013-10-03T22:20:08.670 回答