我正在使用 ServiceStack 为 JSON RESTful 服务创建 C# 客户端。我有这个代码返回我的 DTO:
搜索结果 = restClient.Get(搜索);
这很好用,但为了有效地调试返回的搜索结果,我需要从底层 HTTP 响应对象输出文本内容。(我还不知道响应中的所有元素,以便将它们添加到 DTO)。
有什么方法可以从我的结果对象中获取底层 HTTP 响应,从而获取全文内容?
提前致谢。@adamfowleruk
我正在使用 ServiceStack 为 JSON RESTful 服务创建 C# 客户端。我有这个代码返回我的 DTO:
搜索结果 = restClient.Get(搜索);
这很好用,但为了有效地调试返回的搜索结果,我需要从底层 HTTP 响应对象输出文本内容。(我还不知道响应中的所有元素,以便将它们添加到 DTO)。
有什么方法可以从我的结果对象中获取底层 HTTP 响应,从而获取全文内容?
提前致谢。@adamfowleruk
从 ServiceStack 的内置Service继承时,您可以直接从 Response 类访问底层的 Request 和 Response :
public class MyService : Service
{
public object Get(Request request)
{
base.Request ...
base.Response ...
}
}
您不会在您的服务或过滤器中看到响应输出,因为它直接写入响应流,并且是ServiceStack 在执行您的服务和所有响应过滤器之后所做的最后一件事。
对于诊断 HTTP,我建议使用 Fiddler 或 WebInspector ,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 方 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>>();
我使用Fiddler来调试我的服务。它为您提供了各种很酷的 HTTP 调试工具。
我喜欢使用 RestConsole。它是一个 Chrome 扩展,您可以轻松提交 POST 请求并查看响应。创建示例数据然后进入 ServiceStack 代码并查看发生了什么也很方便。ServiceStack PluralSight 课程有一个很好的演示,展示了如何一起使用它们。
感谢上面的帮助,我找到了正确的答案。在这里为其他人记录:-
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());
}