【问题标题】:Design pattern: ASP.NET API for RPC against a back-end application设计模式:针对后端应用程序的 RPC 的 ASP.NET API
【发布时间】:2013-02-12 15:50:00
【问题描述】:

我正在设计一个 API,以使远程客户端能够针对远程服务器执行 PowerShell 脚本。

为了有效地执行命令,应用程序需要为远程客户端创建一个唯一的运行空间(以便它可以使用适当的主机和该客户端的命令集来初始化运行空间)。每次客户端发出请求时,API 都需要确保请求在正确的运行空间内执行。

流程的(过度简化的)视图可能如下所示:

  1. 客户端连接到 Web API,为后端应用程序发布凭据
  2. Web API 将这些凭据传递给后端应用程序,后端应用程序使用它们来创建为该客户端唯一配置的 RunSpace
  3. Web API 和应用“同意”链接的session-runspace ID
  4. Web API 将session-runspace ID 通知客户端或将其保存在内存中
  5. 客户端提出请求:例如"GET http://myapiserver/api/backup-status/"
  6. Web API 将请求传递到后端应用函数
  7. 后端应用返回结果:例如"JSON {这是用户/客户端 x 的当前备份状态}"
  8. Web API 将这些结果传递给远程客户端
  9. 超时或注销请求结束“会话”并释放 RunSpace

(实际上,PowerShell 应用程序可能只是 Web API 中的自定义控制器/模型,或者它可能是 IIS 管理单元或类似的 - 我愿意在这里提供设计建议...) .

我担心的是,为了为每个远程客户端创建一个唯一的 RunSpace,我需要为该客户端提供一个唯一的“会话”ID,以便 API 可以正确地将请求传递给应用程序。这感觉就像我在打破无国籍规则。

实际上,API 仍然是无状态的,只是后端应用程序不是,但它确实需要为每个客户端创建一个会话 (RunSpace),然后在超时/结束会话请求后处置该 RunSpace。

问题

  1. 我是否应该侵入 ASP.NET MVC 中的身份验证机制来启动 RunSpace?
  2. 我是否应该认输并直接破解会话变量?
  3. 是否有更好的 SOA 值得我考虑? (不过,Web API 感觉非常整洁 - 特别是如果我想拥有网络、移动和你有什么的客户端)

【问题讨论】:

    标签: asp.net-mvc web-services asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    这感觉就像我打破了无国籍规则。

    您的应用程序是有状态的 - 无法绕过它。您必须为每个客户端维护一个进程,并且该进程必须在一个盒子上运行,并且客户端始终连接到同一个盒子。所以如果你有一个服务器,没问题。如果您有多个,则必须使用粘性会话,以便客户端始终返回到同一台服务器(负载均衡器可以为您做到这一点)。

    我是否应该侵入 ASP.NET MVC 中的身份验证机制 启动 RunSpace?

    如果您需要身份验证。

    我是否应该认输并直接破解会话变量?

    没有变量,只使用普通的内存会话。如果服务器超过 1 个,请使用上述的粘性会话。

    是否有更好的 SOA 值得我考虑? (Web API 感觉很整洁 不过要整理一下-特别是如果我想拥有网络,移动设备 和你有什么客户)

    SOA 没有涉及到这一点。您只有一项服务。

    【讨论】:

    • 谢谢 - 我也很害怕。我需要身份验证才能为客户端创建一个唯一的会话(他们将有权访问特定的服务器/命令集)。我想知道在身份验证处理程序或其他地方启动 RunSpace 最有意义的地方。我还想知道 web api 是否是这项工作的最佳工具,或者不同的服务设计模式更有意义。
    猜你喜欢
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 2010-11-09
    • 1970-01-01
    相关资源
    最近更新 更多