5

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

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

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

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

提前致谢。@adamfowleruk

4

4 回答 4

8

从 ServiceStack 的内置Service继承时,您可以直接从 Response 类访问底层的 Request 和 Response :

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

您不会在您的服务或过滤器中看到响应输出,因为它直接写入响应流,并且是ServiceStack 在执行您的服务和所有响应过滤器之后所做的最后一件事

对于诊断 HTTP,我建议使用 Fiddler 或 WebInspector ,ServiceStack 的内置请求记录器也可能会有所帮助。

使用 ServiceStack 服务

如果您使用的是C# 服务客户端,您可以简单地询问您想要什么,例如,您可以将返回的响应作为原始字符串访问:

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 => { .. }
};

使用第 3 方服务

如果您正在使用第 3 方 REST/HTTP API,您可以responseFilter:ServiceStack 的 HTTP Util 扩展中使用:

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>>();
于 2013-03-22T21:53:02.093 回答
3

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

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

于 2013-03-22T21:40:27.303 回答
3

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

于 2013-03-27T09:23:29.160 回答
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());
  }
于 2013-03-23T14:56:44.750 回答