1

ここで説明されているように、ServiceStack サービスからバイナリ ストリームを使用しようとしています。

ServiceStack クライアントでファイルを使用する方法

応答ストリームに直接アクセスしたいので、カスタム WebClient を使用する必要があることに気付きました。ただし、このクライアントを手動で作成することは避けたいと思います。代わりに、次のように書きたいと思います。

var webClient = new JsonServiceClient(baseUrl)
                .ConfigureWebClient(new MyRequestDto { Foo = "bar" }));

こうすれば、URL とクエリ文字列を手作業で組み立てる必要がなくなります。また、リクエスト DTO を変更するときに、カスタム WebClient セットアップ コードを変更することを覚えておく必要もありません。

どういうわけか、これを達成する方法はありますか? 私は見てきましたがServiceClientBase.PrepareWebRequest(...)、自分のコードにコピー/貼り付けしたくない便利な機能がたくさんあります。そのメソッドを継承して直接呼び出したいServiceClientBaseのですが、プライベートなのでできません。他のアイデアはありますか?

4

1 に答える 1

0

ServiceStack のすべての C# サービス クライアントには、グローバル リクエスト フィルターとローカル リクエスト フィルターの両方があり、リクエストとグローバル レスポンス フィルターとローカル レスポンス フィルターを初期化して、返された HttpWebResponse にきめ細かくアクセスできます。

グローバル リクエスト フィルターを使用して、すべての ServiceClients の WebRequest を初期化します。

ServiceClientBase.HttpWebRequestFilter = httpReq => ConfigureWebClient(httpReq);

ローカル リクエスト フィルタの使用:

var client = new JsonServiceClient(baseUrl) {
    LocalHttpWebRequestFilter = httpReq => ConfigureWebClient(httpReq)
};

stringただし、バイナリ応答だけが必要な場合は、すべてのサービス クライアントでbyte[]、、、Streamまたはのいずれかを汎用応答タイプとして指定でき、HttpWebResponse要求されたものが返されます。これらの他の例については、Service Client wiki ページを参照してください。

バイナリ レスポンスを取得する方法は次のとおりです。

byte[] responseBytes = client.Get<byte[]>("/poco/World");
var dto = responseBytes.FromUtf8Bytes().FromJson<PocoResponse>();

またはストリームで:

using (Stream responseStream = client.Get<Stream>("/poco/World")) {
    var dto = responseStream.ReadFully().FromUtf8Bytes().FromJson<PocoResponse>();
}

または、基になる HttpWebResponse から:

HttpWebResponse webResponse = client.Get<HttpWebResponse>("/poco/World");

using (var stream = webResponse.GetResponseStream())
using (var sr = new StreamReader(stream)) {
    var dto = sr.ReadToEnd().FromJson<PocoResponse>();
}

オープン ソース ソフトウェアは変更できます。回避する必要はありません。

ServiceStack はオープン ソース ソフトウェアです。ハッキングを探したり、アクセスできないものや利用できないものを回避しようとする必要はありません。プル リクエストを作成して、必要なものを変更します。それが一般的なユース ケースの有効なリクエストである場合は、受け入れられる可能性があります。それ以外の場合は、ソース コードのフォークを自由に取得して、必要に応じてカスタマイズしてください。

于 2013-03-16T04:56:36.727 に答える