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)
};

尽管如果您只想要二进制响应,所有服务客户端都允许您指定 a stringbyte[]或作为您的通用响应类型StreamHttpWebResponse它会返回所请求的内容。有关这些示例的更多示例,请参见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 回答