1

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

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

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#客户端返回错误?

4

2 回答 2

2

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

据我所知,ToOptimizedResultUsingCache正在尝试基于(请参阅此处此处RequestContext's ResponseContentType的代码)从缓存中提取特定格式(xml、html、json 等)。使用 Soap12ServiceClient 时,ResponseContentType 是 text/html(不确定这在 ServiceStack 中是否正确/有意)。所以从缓存中拉出的是一串html。html 字符串被返回给 Soap12ServiceClient 并导致异常。ToOptimizedResultUsingCache

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

** 如果您使用 Redis 并使用 UrnId.Create 方法创建密钥,您应该会看到类似 urn:ProductResponse:{yourkey}.html 的密钥

于 2013-03-22T20:59:24.957 回答
1

感谢您的回复 paaschpa。我重新访问了代码,并且能够修复它。既然你的回答给了我方向,我接受了你的回答。下面是我的修复。

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

通过 c# 客户端使用时引发错误的代码(代码返回整个请求上下文):

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)
              }
     });
于 2013-03-23T18:43:00.437 回答