使用MVC Controller作为客户端和Web API之间的代理

时间:2014-12-01 19:27:07

标签: c# asp.net asp.net-mvc rest asp.net-web-api

我正在尝试开发单页应用程序。

我使用ASP.NET Web API构建了一个RESTful Web服务。我使用OAuth 2.0Bearer access tokens实现了身份验证。

此Web服务使用memcached和HTTP缓存标头(Cache-ControlETag)来缓存资源和响应。

现在,我非常喜欢ASP.NET MVC技术,也许这种爱让我在不应该的时候使用它。

我正在考虑在我的JavaScript应用程序和我的Web服务之间构建一个MVC中间服务器。

MVC站点会将其请求重定向(或委托)给Web服务。

我发现使用这种方法有很多优点:

  • 我可以将我的消费者密钥(用于身份验证)存储在安全的位置,而不是直接将其存储在JavaScript应用程序中。

  • 我可以为我的JavaScript应用程序提供cookie,这是我的REST Web服务不支持的(因为我认为它会破坏整个“ 无状态 ”并且“ 纯HTTP ”概念。

  • 我很容易为我的观点提供全球化(本地化)。我非常喜欢ASP.NET MVC全球化框架,如果我打算创建一个独立的站点,我不知道如何添加这个功能。

  • 我可以加密我的访问令牌cookie,并在服务器上解密它,迫使我的用户使用我的MVC代理访问Web服务,因为他不知道他的访问令牌。

说明了这些优点后,实现这一点是否值得?

添加代理服务器将使我复制HTTP缓存逻辑,并最终创建2个请求(客户端 - > MVC - > Web API )而不是1(客户端 - > Web API )。

最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

看起来您已经构建了一个优秀的RESTful Web服务,但需要解决Auth和全球化问题:

验证

在Web API上使用此类代理或支持Cookie身份验证会使您容易受到CSRF攻击,因此您还需要实施Synchronizer Token Patternsome other technique来阻止此操作。但是,如果你没有其他选择,那么你应该只使用这种方法,但是你有!

假设javascript应用程序要求用户输入凭据,有不同的方法来处理auth:

两种方式都为您的JS应用程序提供了一个加密的令牌,每次调用受保护的API时都应该传递该令牌。您的应用程序需要将此令牌保留在本地存储中,并在令牌过期时刷新它。

全球化

即使在MVC方面拥有大部分内容,最终您仍然需要Web API来提供翻译的内容。所以我不确定这里的要求是什么,但一般来说,您应该能够以相同的方式在Web API上获取已翻译的资源。例如,请参阅here。 对于HTML部分 - 将其留给ASP.NET MVC,无需将每个标签转换为API。

另外要考虑的要点

  • 性能 - ASP.NET MVC很好,但它不是代理解决方案,它根本不打算构建这样的东西
  • 您真的需要HTTP API吗? 不要忘记,通过HTTP传输数据是另一个开销点,如果用它和MVC代理它就变得特别无用。 在一天结束时 - 如果您将API隐藏在自己的应用程序中,为什么要构建API?

我的回答是:不要隐藏它 - 充分利用它!