2013-03-22 101 views
1

我有一个servicestack服务,当通过浏览器调用(restful)Url ex:http://localhost:1616/myproducts,它工作正常。 服务方法启用了RedisCaching。所以第一次命中数据存储库并将其缓存以供后续使用。servicestack - 使用redis缓存服务响应

我的问题是,当我尝试通过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

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

从我所知道的,ToOptimizedResultUsingCache试图拉特定的格式(XML,HTML,JSON等),基于该RequestContext's ResponseContentType缓存的(见代码herehere)。当使用Soap12ServiceClient时,ResponseContentType是text/html(不确定这是否在ServiceStack中是正确/有意的)。所以ToOptimizedResultUsingCache从缓存中拉出的是一串html。 html字符串正在返回到Soap12ServiceClient并导致异常。

通过直接拉出缓存,您正在绕过ToOptimizedResultUsingCache's“格式检查”并返回Soap12ServiceClient可以处理的内容。

**如果你正在使用Redis的,创造与UrnId.Create方法的关键,你应该看到类似瓮的关键:html的

1

感谢您的答复paaschpa {} yourkey:ProductResponse。 我重新访问了代码,我可以修复它。既然你的回应给了我方向,我已经接受了你的回答。以下是我的修复。

我将返回声明从RequestContext移动到响应DTO。通过C#的客户端使用时抛出错误(代码在返回整个的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) 
       } 
    }); 
+0

你返回缓存结果的地方?您的匿名函数内的返回不是服务调用的返回值。 – paaschpa 2013-03-24 03:11:43