我有一个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#客户端返回错误?
答案 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)
}
});