【发布时间】:2013-02-12 15:50:00
【问题描述】:
我正在设计一个 API,以使远程客户端能够针对远程服务器执行 PowerShell 脚本。
为了有效地执行命令,应用程序需要为远程客户端创建一个唯一的运行空间(以便它可以使用适当的主机和该客户端的命令集来初始化运行空间)。每次客户端发出请求时,API 都需要确保请求在正确的运行空间内执行。
流程的(过度简化的)视图可能如下所示:
- 客户端连接到 Web API,为后端应用程序发布凭据
- Web API 将这些凭据传递给后端应用程序,后端应用程序使用它们来创建为该客户端唯一配置的 RunSpace
- Web API 和应用“同意”链接的
session-runspaceID - Web API 将
session-runspaceID 通知客户端或将其保存在内存中 - 客户端提出请求:例如
"GET http://myapiserver/api/backup-status/" - Web API 将请求传递到后端应用函数
- 后端应用返回结果:例如"JSON {这是用户/客户端 x 的当前备份状态}"
- Web API 将这些结果传递给远程客户端
- 超时或注销请求结束“会话”并释放 RunSpace
(实际上,PowerShell 应用程序可能只是 Web API 中的自定义控制器/模型,或者它可能是 IIS 管理单元或类似的 - 我愿意在这里提供设计建议...) .
我担心的是,为了为每个远程客户端创建一个唯一的 RunSpace,我需要为该客户端提供一个唯一的“会话”ID,以便 API 可以正确地将请求传递给应用程序。这感觉就像我在打破无国籍规则。
实际上,API 仍然是无状态的,只是后端应用程序不是,但它确实需要为每个客户端创建一个会话 (RunSpace),然后在超时/结束会话请求后处置该 RunSpace。
问题
- 我是否应该侵入 ASP.NET MVC 中的身份验证机制来启动 RunSpace?
- 我是否应该认输并直接破解会话变量?
- 是否有更好的 SOA 值得我考虑? (不过,Web API 感觉非常整洁 - 特别是如果我想拥有网络、移动和你有什么的客户端)
【问题讨论】:
标签: asp.net-mvc web-services asp.net-mvc-4 asp.net-web-api