如何从中间Web API服务捕获HTTP流量?

时间:2013-04-02 01:56:54

标签: debugging rest asp.net-web-api fiddler wireshark

以下是我目前的设置:

客户端应用----->中介Web API服务(接收来自客户的呼叫)------>第三方RESTful服务(接收来自中介服务的电话)

因此,如果我将来自客户端的呼叫发送到中间服务 来自第3方服务的中间服务的呼叫,我可以使用Fiddler或Wireshark检查POSTed XML / JSON。

问题是当我从客户端一直拨打电话时,我想检查从中介服务发送到第三方服务的实际原始HTTP传出消息。如果我在包含中间服务的服务器上运行Fiddler,我看不到HTTP流量从它出站。我也尝试过Wireshark,它也没有接收到流量。但是我知道它正在发生,因为第三方服务正在向我发送错误。

中间服务充当客户端应用程序到第三方服务的外观,并在将另一个HTTP客户端出站到第三方服务之前对来自客户端的数据进行按摩。我遇到第三方服务接受传出消息的问题,并且确实需要看到中间服务忽略原始HTTP消息(我使用HttpClient.PostAsync将数据发布到第三方服务)。我在发送之前已经将它持久保存到数据库中,但是我提出的内容似乎没问题。

所以主要的问题是,如何获得我的中间服务正在向第三方服务发布的消息?是否有Fiddler,Wireshark或其他程序可以用来检查从该中介服务出站的HTTP消息?

2 个答案:

答案 0 :(得分:2)

配置“中间Web API服务”以通过在相同(或不同)计算机上运行的Fiddler实例来代理其流量,这样可以正常工作。

如果您的服务是用.NET编写的,您可以手动配置其代理:http://www.fiddler2.com/fiddler/help/hookup.asp#Q-DOTNET或者您可以更新machine.config或web.config:http://www.telerik.com/automated-testing-tools/blog/eric-lawrence/13-01-08/capturing-traffic-from-net-services-with-fiddler.aspx以便其流量通过Fiddler实例。

答案 1 :(得分:0)

我不认为Fiddler会工作,因为它只拦截在浏览器中进行的调用。你能修改你的中间代码吗?您可以注入一个处理程序,用于在HttpClient中记录用于调用第三方服务的消息。处理程序看起来像这样,

public class LogginHandler : DelegatingHandler
{
    public LogginHandler(HttpMessageHandler inner)
        : base(inner)
    {
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
            using (var fs = new FileStream("c:\\temp\\log.txt", FileMode.Create, FileAccess.Write))
            {
                await request.Content.CopyToAsync(fs);
            }

            return await base.SendAsync(request, cancellationToken);

    }
}

用于在像这样的HttpClient实例中注入此处理程序的代码,

HttpClient client = new HttpClient(new LogginHandler(new HttpClientHandler()));