Tag: servicestack

当代码的所有部分都不是异步时,异步Web服务有什么好处

我想知道如果不是代码的所有部分都是异步的,那么使用异步http请求会带来多少好处。 让我们考虑一下场景:1)异步http请求阻塞同步数据库调用,以及2)同步等待异步数据库调用的http请求。 1)Web Api支持异步操作方法,但是如果我在处理请求时执行同步数据库调用,那么线程会阻塞调用,并且我不会获得async可以给我的更好的线程经济性的好处或什么? 2)如果我有一个等待异步数据库调用的同步ServiceStack服务调用,那么会发生什么? 我假设一个线程被保留用于处理整个同步http请求,当这个线程等待异步调用时,它仍然保留给Web请求或者什么? 基本上我的问题可归结为:如果不是所有的IO调用都是异步的话,有没有理由使用异步?

Redis serviceStack池化连接客户端

我正在设计一个使用Redis作为数据库的Web服务,我想知道使用Redis连接StackService客户端的最佳实践。 关键是我一直在阅读Redis,我发现与服务器交互的最佳方式是使用单个并发连接。 问题是,尽管每次Web客户端向Web服务发出请求时我都在使用PooledRedisClientManager ,但我得到了一个连接到redis服务器的连接客户端(打开的连接),并且这个连接的客户端数量增加而且限制消耗更多更多的记忆。 样本’故障’代码: PooledRedisClientManager pooledClientManager = new PooledRedisClientManager(“localhost”); var redisClient = pooledClientManager.GetClient(); using (redisClient) { redisClient.Set(“key1”, “value1”); } 我为解决这个问题所做的是创建一个用静态RedisClient var实现单例模式的类; 如果未初始化redisClient则创建一个新的,如果是,则返回初始化的。 解: public class CustomRedisPooledClient { private static CustomRedisPooledClient _instance = null; public RedisClient redisClient = null; // Objeto sincronización para hacer el Lock private static object syncLock = new object(); private CustomRedisPooledClient() […]

如何在ServiceStack中翻译复杂对象?

假设我有两个对象: class Order { string Name {get; set;} Customer Customer {get; set;} Item[] Items {get; set;} } 和 class OrderDTO { string Name {get; set;} CustomerDTO Customer {get; set;} ItemDTO[] Items {get; set;} } 如果我收到一个完全填充的对象orderDTO并执行orderDTO.TranslateTo() ,结果将只填充Name ,而不是Customer或Items 。 有没有办法进行递归转换,或者唯一的选择是手动翻译客户和每个项目?

PooledRedisClientManager不释放连接

我在redis中存储json数据列表并使用ServiceStack c#client访问它。 我基本上管理我自己的外键,我存储一个zrange的id,我使用我的应用程序内部的接口从zrange提取id,然后从Redis获取底层的json对象并将它们打包为列表以返回我申请的其他部分。 我正在使用PooledRedisClientManager因为我预计Redis将托管在与执行代码的服务器不同的服务器上。 我正在使用MSOpenTech Redis服务器在Windows 8上本地完成所有开发工作。 目前,我最大的挑战是客户端连接没有被关闭。 我的Redis persister正在注入一个IRedisClientManager实例(IoC是CastleWindsor)。 此代码在azure worker角色的上下文中执行。 这是我从zrange获取项目的方式: public class MyRedisPersister : IResourcePersister { IRedisClientManager _mgr; public MyRedisPersister(IRedisClientManager mgr) { _mgr = mgr; } public IResourceList Get(string key, int offset, int count) where T { using (var redis = _clientManager.GetClient()) { var itemKeys = redis.GetRangeFromSortedSet(key, offset, offset + count – […]

ServiceStack是否支持反向路由?

在REST之后,建议API是可发现的,并且应该是相互关联的。 ServiceStack是否支持任何类型的反向路由? 我在ASP MVC中寻找像Url.RouteLink这样的东西。

ServiceStack AppHost是单身人士吗?

我一直在评估ServiceStack,到目前为止,我已经出售了很多 – 但我有一个要求,我认为这将成为一个交易破坏者。 我基本上需要多个AppHost派生的实例。 第一个很好地旋转,但其余的失败因为“AppHostBase.Instance已经设置”。 这是否意味着如果我想要多个主机(在不同的Uris上),使用不同的可执行文件? 如果是这样,这是相当令人失望的,因为除了这个限制之外,这个库在其他方面都是完美的。 如果我错了,有人能指出我的解决方案吗? 请允许我详细说明一下。 我们计划通过网络提供许多服务。 我的目的是将它们设计为单独的服务,然后在托管类中“托管”。 托管类本身是用于管理目的的服务,并且具有启动和停止服务的能力。 它们在整个网络中是“可被发现的”。 我们可以在不同时间或不同时间启动和降低不同机器上的服务。 我的计划是为每个事物使用服务堆栈,并且能够在任何机器和任何“主机”上以临时方式创建和销毁服务。 我唯一磕磕绊绊的是AppHost只被初始化一次。 显然我做错了,所以关于如何在同一个可执行文件中托管多个服务的任何信息都会很棒:)

ServiceStack支持在每次调用的基础上有条件地忽略REST响应中的字段

至少,我正在寻找一种方法来有条件地排除资源上的某些属性,使其不被包含在每个呼叫的响应中(参见下面的fields )。 理想情况下,我想使用ServiceStack实现REST服务,该服务支持以下所有要点。 UPDATE 虽然我一般都非常喜欢ServiceStack的方法,但如果可能的话,我更愿意使用它,如果它不是特别适合这些想法,我宁可不要向后弯腰,让它变得有效。 如果是这样的话,任何人都可以指向另一个可能更合适的c#框架吗? 当然,我正在积极探索其他选择。 在本次题为“ 设计REST + JSON API ”的演讲中,演示者在JSON中描述了他的资源引用策略(通过资源上的href属性)。 除此之外,他还描述了两个查询参数( fields和expand ),用于控制调用REST服务的响应所包含的数据。 我一直在努力尝试挖掘ServiceStack框架以获得对fields支持,但迄今为止一直没有成功。 这在ServiceStack目前是否可行? 理想情况下,解决方案将与格式无关,因此可以使用所有ServiceStack支持的输出格式。 我认为expand将采用相同的策略。 我将在这里描述这些function,但我认为链接上的谈话可以更好地解释它们。 假设我们有一个Profiles资源,其中包含以下属性: givenName , surname , gender和favColor 。 “个人档案”资源还包括用户在socialNetworks属性中所属的社交网络列表。 href – (video中的42:22)每个资源都包含REST服务上的完整链接。 将返回对GET /profiles/123调用 { “href”:”https://host/profiles/123″, “givenName”:”Bob”, “surname”:”Smith”, “gender”:”male”, “favColor”:”red”, “socialNetworks”: { “href”:”https://host/socialNetworkMemberships?profileId=123″ } } 请注意, socialNetworks属性返回的对象仅填充了href值。 这样可以使响应更短且更集中,同时还为最终用户提供足够的信息,以便在需要时提供进一步的请求 在这个庄园中全面使用的href属性使得重用资源数据结构作为其他资源的子项变得容易(概念上无论如何)。 fields – (video中55:44)查询字符串参数,指示服务器仅在REST响应中包含所需资源的指定属性。 GET /profiles/123正常响应将包括资源的所有属性,如上所示。 当fields查询参数包含在请求中时,仅返回指定的字段。 […]

如何在ServiceStack中进行身份validation后重定向

我像这样覆盖了CredentialsAuthProvider: public override bool TryAuthenticate(IServiceBase authService, string userName, string password) { //TODO: Auth the user and return if valid login return true; } public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary authInfo) { base.OnAuthenticated(authService, session, tokens, authInfo); //User has been authenticated //Find the user’s role form the DB if (roleA) //GOTO mypage1 if […]

使用ServiceStack使用REST Web服务时的用户身份validation

ServiceStack文档中有很多关于如何使用服务器端实现用户身份validation的示例。 但是如何在客户端设置用户凭据? 我使用ServiceStack来使用这样的JSON REST服务: var restClient = new JsonServiceClient (baseUri); var response = restClient.Get (“/some/service”); 如何在请求中添加任何forms的身份validation? 我想要使​​用的Web服务使用OAuth 1.0 ,但我也有兴趣添加自定义身份validation。 在我的代码中,我之前已经成功执行了OAuth令牌交换,因此我已经拥有了一个有效的访问令牌,现在需要使用此访问令牌及其token_secret对每个REST请求进行token_secret 。

更新服务堆栈Redis列表

有没有正确的方法来更新IRedisList? 使用下面的示例代码,我可以修改它以删除列表,更新比萨饼并重新添加列表,但这感觉不对。 命令行文档很漂亮,但它是一个比我更大的项目,我不完全确定从哪里开始寻找。 public void UpdatePizza(Pizza pizza) { using (var redisClient = new RedisClient(Host, Port)) { IRedisTypedClient redis = redisClient.As(); IRedisList pizzas = redis.Lists[“pizzas:live”]; var toUpdate = pizzas.First(x => x.Id == pizza.Id); toUpdate.State = pizza.State; //??How to save } }