自动生成WebRequest

时间:2013-03-16 04:21:16

标签: rest web client servicestack

我正在尝试从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并直接调用该方法,但它是私有的,所以我不能。有没有人有其他想法?

1 个答案:

答案 0 :(得分:0)

所有ServiceStack's C# Service Clients都有一个全局和本地请求过滤器,允许您初始化请求和全局和本地响应过滤器,允许对返回的HttpWebResponse进行细粒度访问。

使用全局请求过滤器初始化所有ServiceClient的WebRequest:

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

使用本地请求过滤器:

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

虽然您只想要二进制响应,但所有服务客户端都允许您指定stringbyte[]StreamHttpWebResponse作为您的通用响应类型将返回所要求的内容。有关这些内容的更多示例,请参阅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是开源软件,无需查找黑客或尝试解决无法访问或无法访问的内容,提出拉动请求以更改您想要的内容以及是否为常用的有效请求 - 案件可能会被接受。否则,请随意使用源代码的分支并根据需要自定义它。