1

私は、ブラウザ(安らかな) Url ex: を介して呼び出されたときに servicestack サービスを持っていますが、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は に基づいてキャッシュから特定の形式 (xml、html、json など) を取得しようとしています (RequestContext's ResponseContentTypeコードはこちらこちらを参照)。Soap12ServiceClient を使用する場合、ResponseContentType は text/html です (これが ServiceStack 内で正しいか意図的かどうかは不明です)。ToOptimizedResultUsingCacheキャッシュから引き出されているのはhtmlの文字列です。HTML 文字列が Soap12ServiceClient に返され、例外が発生しています。

キャッシュから直接引き出すことで、ToOptimizedResultUsingCache's「フォーマット チェック」をバイパスし、Soap12ServiceClient が処理できるものを返します。

** Redis を使用し、UrnId.Create メソッドでキーを作成している場合、urn:ProductResponse:{yourkey}.html のようなキーが表示されます。

于 2013-03-22T20:59:24.957 に答える
1

回答ありがとうございますpaaschpa。コードを再検討し、修正することができました。あなたの返事が私に方向性を与えてくれたので、私はあなたの答えを受け入れました。以下は私の修正です。

returnステートメントを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)
              }
     });
于 2013-03-23T18:43:00.437 に答える