2013-03-22 97 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

相關問題