servicestack - 使用redis缓存服务响应

时间:2013-03-22 06:31:28

标签: caching redis servicestack

我有一个servicestack服务,当通过浏览器调用(restful)Url ex:http://localhost:1616/myproducts时,它运行正常。 服务方法已启用RedisCaching。因此,它首次访问数据存储库并将其缓存以供后续使用。

我的问题是当我尝试通过Soap12ServiceClient从c#客户端调用它时。它返回以下错误:

Error in line 1 position 183. Expecting element '<target response>' 
from namespace 'http://schemas.datacontract.org/2004/07/<target namespace>'.. 
Encountered 'Element'  with name 'base64Binary', 
namespace 'http://schemas.microsoft.com/2003/10/Serialization/'.

以下是我的客户代码:

 var endpointURI = "http://mydevelopmentapi.serverhostingservices.com:1616/"; 
 using (IServiceClient client = new Soap12ServiceClient(endpointURI))
 {
    var request = new ProductRequest { Param1 = "xy23432"};
    client.Send<ProductResponse>(request);
 }

似乎使用的soapwsdl给出了问题,但我似乎使用了servicestack生成的默认值。

非常感谢任何帮助。

更新

我通过更改服务端的缓存代码来解决此错误:

在客户端返回错误的代码:

return RequestContext.ToOptimizedResultUsingCache(this.CacheClient, cacheKey,
       () =>
       new ProductResponse(){CreateDate = DateTime.UtcNow, 
                    products = new productRepository().Getproducts(request)
     });

现在有效的代码:

var result = this.CacheClient.Get<ProductResponse>(cacheKey);
            if (result == null)
            {
                this.CacheClient.Set<ProductResponse>(cacheKey, productResult); 
                result = productResult;
            }
return result;

但我仍然很想知道为什么第一个方法(RequestContext.ToOptimizedResultUsingCache)在c#客户端返回错误?

2 个答案:

答案 0 :(得分:2)

但我仍然很想知道为什么第一个方法(RequestContext.ToOptimizedResultUsingCache)在c#客户端返回错误?

据我所知,ToOptimizedResultUsingCache正试图根据RequestContext's ResponseContentType从缓存中提取特定格式(xml,html,json等)(参见代码here }和here)。使用Soap12ServiceClient时,ResponseContentType是text / html(不确定ServiceStack中是否正确/有意)。那么ToOptimizedResultUsingCache从缓存中取出的是一串html。 html字符串将返回到Soap12ServiceClient并导致异常。

通过直接拉出缓存,您可以绕过ToOptimizedResultUsingCache's&#39;格式检查&#39;并返回Soap12ServiceClient可以处理的内容。

**如果你使用Redis并使用UrnId.Create方法创建密钥,你应该看到一个像urn这样的密钥:ProductResponse:{yourkey} .html

答案 1 :(得分:1)

感谢您的回复paaschpa。 我重新访问了代码,我能够修复它。由于您的回复给了我指示,我接受了您的回答。以下是我的修复。

我将 return 语句从RequestContext移到了响应DTO。

通过c#client使用时抛出错误的代码(代码返回整个requestcontext):

return RequestContext.ToOptimizedResultUsingCache(this.CacheClient, cacheKey,
       () =>
       new ProductResponse(){CreateDate = DateTime.UtcNow, 
                    products = new productRepository().Getproducts(request)
     });

固定代码(返回移至响应DTO):

RequestContext.ToOptimizedResultUsingCache(this.CacheClient, cacheKey,
       () => {
               return new ProductResponse(){CreateDate = DateTime.UtcNow, 
               products = new productRepository().Getproducts(request)
              }
     });