在ServiceStack中查看Http响应内容

时间:2013-03-22 21:37:34

标签: json rest servicestack

我正在使用ServiceStack为JSON RESTful服务创建C#客户端。我有这个代码返回我的DTO:

搜索结果= restClient.Get(搜索);

这很好用,但为了有效地调试返回的搜索结果,我需要从底层的HTTP Response对象输出文本内容。 (我还不知道响应中的所有元素,以便将它们添加到DTO中。)

有什么方法可以从我的结果对象中获取底层HTTP响应,从而得到全文内容?

提前致谢。 @adamfowleruk

4 个答案:

答案 0 :(得分:8)

从ServiceStack的内置服务继承时,您可以直接从Response类访问基础请求和响应:

public class MyService : Service 
{
    public object Get(Request request)
    {
        base.Request ...
        base.Response ...
    }
}

您不会在服务或过滤器中看到响应输出,因为它直接写入响应流并且是last thing that ServiceStack does after executing your service and all response filters

对于诊断HTTP,我建议使用Fiddler或WebInspector ServiceStack's built-in Request Logger也可以提供帮助。

使用ServiceStack服务

如果您使用C# Service Clients,则只需询问您想要的内容,例如您可以作为原始字符串访问返回的响应:

string responseJson = client.Get<string>("/poco/World");

或者作为原始字节:

byte[] responseBytes = client.Get<byte[]>("/poco/World");

或者作为一个流:

using (Stream responseStream = client.Get<Stream>("/poco/World")) {
    var dto = responseStream.ReadFully().FromUtf8Bytes().FromJson<PocoResponse>();
}

甚至可以访问填充的HttpWebResponse对象:

HttpWebResponse webResponse = client.Get<HttpWebResponse>("/poco/World");

webResponse.Headers["X-Response"] //World
using (webResponse)
using (var stream = webResponse.GetResponseStream())
using (var sr = new StreamReader(stream)) {
    string response = sr.ReadToEnd();
}

您还可以使用全局和本地响应过滤器来反省HttpWebResponse,例如:

JsonServiceClient.HttpWebResponseFilter = httpRes => { .. };

或使用本地过滤器:

var client = new JsonServiceClient(baseUrl) { 
    ResponseFilter = httpRes => { .. }
};

消费第三方服务

如果您正在使用第三方REST / HTTP API,则可以使用ServiceStack's HTTP Util extensions中的responseFilter:

List<GithubRepo> repos = "https://api.github.com/users/{0}/repos".Fmt(user)
    .GetJsonFromUrl(responseFilter: httpRes => {
        var remaining = httpRes.Headers["X-Api-Remaining"];
    })
    .FromJson<List<GithubRepo>>();

答案 1 :(得分:3)

我使用Fiddler来调试我的服务。它为您提供了各种很酷的HTTP调试工具。

http://www.fiddler2.com/fiddler2/

答案 2 :(得分:3)

我喜欢使用RestConsole。它是Chrome扩展程序,您可以轻松提交POST请求并查看响应。创建样本数据然后进入ServiceStack代码并查看正在发生的事情也很方便。 ServiceStack PluralSight课程有一个很好的演示如何一起使用它们。

答案 3 :(得分:2)

感谢上述帮助,我找到了正确的答案。在这里为他人记录: -

  SearchResponse result = null; // my ServiceStack DTO

  HttpWebResponse webResponse = restClient.Get<HttpWebResponse>(
    completePath("/v1/search",qp)); // builds the URL with parameters

  using (var stream = webResponse.GetResponseStream())
  using (var sr = new StreamReader(stream)) {
    var text = sr.ReadToEnd();
    log.log ("response text: " + text); // *** PRINTING STRING VALUE HERE FOR DEBUG 
    result = text.FromJson<SearchResponse>();
  }

  // Now do something useful with the result DTO object

  log.log ("RESULT: " + result.ToString ());
  for (int i = 0; i < result.Results.Length; i++) {
    log.log ("Result " + i + ": " + result.Results[i].ToString());
  }