我正在尝试使用ServiceStack来构建一个新的移动产品。它正在慢慢融合在一起,但文档尽管很好,但在部分内容有点简短,没有评论的便利性。的问题。
此问题与内置身份验证有关。
我一直在使用SocialBootstrap,这是一个很好的例子,虽然我缺乏骨干经验是一个障碍。我想同时学习,但没有时间去做,所以想继续传统观点。
基于此,有一些样本或文档扩展非常有用。
1。为什么AuthUserSession
字符串上的所有属性都是
我已经通过CustomUserSession
类看到你可以创建一个CustomId
但是不应该是数据库表的AutoIncrement
属性的默认属性映射吗?必须解析为整数并不是很理想。我想它只做了一次,但看起来仍然很奇怪。
var user = session.TranslateTo<User>();
user.Id = int.Parse(session.UserAuthId);
2。检索会话
我的控制器派生自实现ControllerBase
的{{1}},因此使用ServiceStackController<CustomUserSession>
可以轻松地从控制器进入会话。如果我需要访问base.UserSession
中的会话,那么我只需将会话填入View
属性。
我的服务延伸ViewBag
,目前我能够访问会话的唯一方法是注入AppServiceBase
:
ClientCache
然后致电:
public ICacheClient CacheClient { get; set; }
这似乎不是最优雅的解决方案,所以我希望有一种我不知道的更好的方法。这导致..
第3。 IClientCache
从阅读this question看起来我需要实现更持久的会话缓存。每次重新编译,保存var userSession = SessionFeature.GetOrCreateSession<AuthUserSession>(CacheClient);
或任何其他应用程序重置操作时都必须进行身份验证,这非常烦人。
推荐的更持久缓存的解决方案是使用Memcached吗?不幸的是,在过去,我只使用了FormsAuthentication,所以这又是一个新领域。
_layout
4。手动注册
这很奇怪。我试图在没有互联网连接的情况下进行编码,因此我实施了手动注册,以避免在控制器上注释掉所有container.Register<ICacheClient>(new MemcachedClientCache("127.0.0.0[:11211]");
属性(视图也有一些登录逻辑)。
它有效,或者我记得它正常工作,因为我可以继续调试。然而现在回到互联世界却没有。并且API端点似乎不存在。如果我浏览到[Authenticate]
,那么我会收到/api/register
。同样,由于我没有使用骨干,我有一个javascript函数来执行工作:
NotImplementedException
这也会返回var gateway = new servicestack.ClientGateway(location.protocol + "//" + location.host + '/api/');
function intiRegisterUser() {
$('#signup-button').click(function () {
gateway.postFormDataToService({
Register: {
userName: $('#Username').val(),
displayName: $('#Username').val(),
firstName: $('#FirstName').val(),
lastName: $('#LastName').val(),
email: $('#Email').val(),
password: $('#Password').val()
}
},
function(e) {
document.location = "/";
},
function(ex) {
handleError(ex);
});
});
}
。
这个文档页面很棒,但可以扩展一下以包含其中一些。
答案 0 :(得分:3)
<强> 1。为什么AuthUserSession字符串上的所有属性都是
ServiceStack's built-in Authentication旨在支持多个Auth Repository和Session提供程序后端。为了能够支持多个提供程序并减少创建新提供程序所需的摩擦,许多元数据属性保留为可以保存任何数据类型的字符串(而不是只能容纳32位整数的int)。 / p>
<强> 2。检索会话
使用ServiceStack's New API时,您可以从方便的Service基类继承,它允许您使用以下命令访问键入的UserAuthSession:
base.SessionAs<AuthUserSession>();
它还提供对动态Session包的访问:
base.Session["dynamicProperty"]
第3。 IClientCache 强>
如果您想要永久缓存,请使用ServiceStack's distributed cache providers中的任何一个。我推荐Redis holds many advantages over Memcached并且easy to get running in Windows with Vagrant:
<强> 4。手动注册
/api/register
服务only implements HTTP POST。虽然注册服务的custom route for the Registration Service is /register pre-defined route(您的示例正在使用)由Registration Request DTO推断,但是:
/api/json/syncreply/Registration
或as of v3.9.35 release,较短的别名:
/api/json/reply/Registration
因此,您的javascript示例需要使用注册属性,例如:
gateway.postFormDataToService({
Registration: { .. }
});