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