【问题标题】:ServiceStack JsonServiceClient Response HeaderServiceStack JsonServiceClient 响应头
【发布时间】:2018-04-07 19:12:09
【问题描述】:

我是 ServiceStack 的新手,所以请原谅我的无知...

我如何将JsonServiceClient 提供给我的DataContract 响应对象,并允许我仅通过一个请求来获取响应标头?

我已经想出如何像这样返回填充的 DataContract 响应对象:

var field1 = "aaa";
var field2 = "bbb";

var client = new JsonServiceClient("https://api.server.com/api");
Response1 response1 = client.Post(new Request1() { Field1= field1, Field2= field2});

我还想出了如何从 HttpWebResponse 这样的重载中获取响应标头项(见下文),这需要稍微修改注释掉请求数据合约接口,如下所示: class Request1 //: IReturn<Response1>:

var field1 = "aaa";
var field2 = "bbb";

var client = new JsonServiceClient("https://api.server.com/api");
HttpWebResponse response1 = client.Post(new Request1() { Field1= field1, Field2= field2});
var value = response1.Headers.GetValues("Item")[0];

但是,我怎样才能同时做到这两个呢?

我确实知道如何使用.PostJsonToUrl() 扩展方法来做到这一点,但我的问题是如何使用JsonServiceClient 来做到这一点。如果有人好奇,这里是我如何使用 .PostJsonToUrl() 扩展方法做到的:

var url = "https://api.server.com/api/method";
string value = null;
Response1 response1 = url.PostJsonToUrl(new Request1() { Field1= field1, Field2= field2},
    null, httpResponse =>
    {
        value = httpResponse.Headers.GetValues("Item")[0];
    }).FromJson<Request1>();

这是我的 DataContract 类

[Route("/method")]
[DataContract]
class Request1 : IReturn<Response1>
{
    [DataMember(Name = "field1")]
    public string Field1 { get; set; }
    [DataMember(Name = "field2")]
    public string Field2 { get; set; }
}

[DataContract]
class Response1
{
    [DataMember(Name = "field1")]
    public long Field1 { get; set; }

    [DataMember(Name = "field2")]
    public string Field2 { get; set; }

    [DataMember(Name = "field3")]
    public string Field3 { get; set; }
}

【问题讨论】:

    标签: c# rest servicestack


    【解决方案1】:

    所有ServiceStack's .NET Clients 都包含ResponseFilter 和静态GlobalResponseFilter 属性,可用于在响应反序列化之前检查HTTP 响应,例如:

    string myHeader = null;
    var client = new JsonServiceClient(baseUrl) {
        ResponseFilter = res => myHeader = res.Headers["X-MyHeader"],
    };
    
    var response = client.Post(request);
    

    response 将包含反序列化的响应正文,myHeader 将填充 X-MyHeader HTTP 标头的值。

    【讨论】:

      猜你喜欢
      • 2021-12-03
      • 2017-07-22
      • 1970-01-01
      • 2022-06-28
      • 2023-03-06
      • 2016-12-29
      • 2017-11-22
      • 2015-03-10
      • 1970-01-01
      相关资源
      最近更新 更多