我正在尝试使用来自ServiceStack服务的二进制流,如下所述:
How to consume a file with a ServiceStack client
我意识到我必须使用自定义的WebClient,因为我想直接访问响应流。然而,我仍然希望避免手工制作这个客户端。相反,我想写一些像这样的东西,
var webClient = new JsonServiceClient(baseUrl)
.ConfigureWebClient(new MyRequestDto { Foo = "bar" }));
这样,我就不必手工组装URL和查询字符串;当我更改请求DTO时,我也不必记得更改自定义的WebClient设置代码。
有没有办法做到这一点呢?我看过ServiceClientBase.PrepareWebRequest(...)
,它做了很多有用的事情,我不想把它们复制/粘贴到我自己的代码中。我很想继承ServiceClientBase
并直接调用那个方法,但它是私有的,所以我不能。
发布于 2013-03-16 12:56:37
所有ServiceStack's C# Service Clients都同时具有全局和本地请求过滤器,允许您初始化请求和全局和本地响应过滤器,从而允许对返回的HttpWebResponse进行细粒度访问。
使用全局请求筛选器初始化所有ServiceClients的WebRequest:
ServiceClientBase.HttpWebRequestFilter = httpReq => ConfigureWebClient(httpReq);
使用本地请求筛选器:
var client = new JsonServiceClient(baseUrl) {
LocalHttpWebRequestFilter = httpReq => ConfigureWebClient(httpReq)
};
但是,如果您只想要二进制响应,则所有服务客户端都允许您指定string
、byte[]
、Stream
或HttpWebResponse
作为通用响应类型,并且它将返回所请求的内容。有关这些内容的更多示例,请参阅Service Client wiki page。
下面是如何检索二进制响应的方法:
byte[] responseBytes = client.Get<byte[]>("/poco/World");
var dto = responseBytes.FromUtf8Bytes().FromJson<PocoResponse>();
或者使用Stream:
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是开源软件,不需要寻找黑客,也不需要尝试解决一些无法访问或不可用的东西,提出一个拉式请求来更改您想要的内容,如果这是一个针对常见用例的有效请求,它很可能会被接受。否则,请随意使用源代码的分支,并按您的意愿对其进行自定义。
https://stackoverflow.com/questions/15445517
复制相似问题