首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自动生成WebRequest

自动生成WebRequest
EN

Stack Overflow用户
提问于 2013-03-16 12:21:16
回答 1查看 99关注 0票数 1

我正在尝试使用来自ServiceStack服务的二进制流,如下所述:

How to consume a file with a ServiceStack client

我意识到我必须使用自定义的WebClient,因为我想直接访问响应流。然而,我仍然希望避免手工制作这个客户端。相反,我想写一些像这样的东西,

代码语言:javascript
运行
复制
var webClient = new JsonServiceClient(baseUrl)
                .ConfigureWebClient(new MyRequestDto { Foo = "bar" }));

这样,我就不必手工组装URL和查询字符串;当我更改请求DTO时,我也不必记得更改自定义的WebClient设置代码。

有没有办法做到这一点呢?我看过ServiceClientBase.PrepareWebRequest(...),它做了很多有用的事情,我不想把它们复制/粘贴到我自己的代码中。我很想继承ServiceClientBase并直接调用那个方法,但它是私有的,所以我不能。

EN

回答 1

Stack Overflow用户

发布于 2013-03-16 12:56:37

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

使用全局请求筛选器初始化所有ServiceClients的WebRequest:

代码语言:javascript
运行
复制
ServiceClientBase.HttpWebRequestFilter = httpReq => ConfigureWebClient(httpReq);

使用本地请求筛选器:

代码语言:javascript
运行
复制
var client = new JsonServiceClient(baseUrl) {
    LocalHttpWebRequestFilter = httpReq => ConfigureWebClient(httpReq)
};

但是,如果您只想要二进制响应,则所有服务客户端都允许您指定stringbyte[]StreamHttpWebResponse作为通用响应类型,并且它将返回所请求的内容。有关这些内容的更多示例,请参阅Service Client wiki page

下面是如何检索二进制响应的方法:

代码语言:javascript
运行
复制
byte[] responseBytes = client.Get<byte[]>("/poco/World");
var dto = responseBytes.FromUtf8Bytes().FromJson<PocoResponse>();

或者使用Stream:

代码语言:javascript
运行
复制
using (Stream responseStream = client.Get<Stream>("/poco/World")) {
    var dto = responseStream.ReadFully().FromUtf8Bytes().FromJson<PocoResponse>();
}

或者来自底层的HttpWebResponse:

代码语言:javascript
运行
复制
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是开源软件,不需要寻找黑客,也不需要尝试解决一些无法访问或不可用的东西,提出一个拉式请求来更改您想要的内容,如果这是一个针对常见用例的有效请求,它很可能会被接受。否则,请随意使用源代码的分支,并按您的意愿对其进行自定义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15445517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档