如何使用Fiddler监视WCF服务

时间:2011-01-07 20:10:13

标签: wcf fiddler

我有一个接受复杂类型并返回一些数据的WCF服务。我想使用Fiddler来查看对服务的传入请求是什么样的。客户端是.net控制台应用程序,它使用服务引用代理。这与Fiddler有关吗?我是这个工具的新手,并且过去只使用它来使用请求构建器发布数据。

11 个答案:

答案 0 :(得分:140)

您需要在web.config

中添加此内容
<system.net>
  <defaultProxy>
    <proxy bypassonlocal="False" usesystemdefault="True" proxyaddress="http://127.0.0.1:8888" />
  </defaultProxy>
</system.net>
  1. 然后在WEBSERVER计算机上启动Fiddler。
  2. 点击工具| Fiddler Options =&gt; Connections =&gt;将端口调整为8888.(如果需要,允许远程)
  3. 好的,然后从文件菜单中捕获流量。
  4. 这就是全部,但不要忘记在关闭fiddler之后删除web.config行,因为如果你不这样做就会出错。

    参考:http://fiddler2.com/documentation/Configure-Fiddler/Tasks/UseFiddlerAsReverseProxy

答案 1 :(得分:8)

Fiddler会侦听出站请求而不是入站请求,因此您无法使用Fiddler监控所有进入您服务的请求。

Fiddler最好的办法是能够查看由控制台应用程序生成的所有请求(假设应用程序生成Web请求而不是使用其他管道)。

如果你想要一个功能更强大(但更难以使用)的工具,你可以监控所有传入的请求,你应该查看WireShark。

修改

我的立场得到了纠正。感谢Eric Law将指示发布到configuring Fiddler to be a reverse proxy

答案 2 :(得分:8)

刚出现这个问题,对我有用的是使用localhost.fiddler:

 <endpoint address="http://localhost.fiddler/test/test.svc"
            binding="basicHttpBinding" 
            bindingConfiguration="customBinding" 
            contract="test" 
            name="customBinding"/>

答案 3 :(得分:6)

整合几个用例的评论/答案中提到的警告。

大多数情况下,请参阅http://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/ConfigureDotNETApp

  • 在您的应用之前启动Fiddler
  • 在控制台应用中,您可能不需要指定proxyaddress

    <proxy bypassonlocal="False" usesystemdefault="True" />
    
  • 在IIS中托管的Web应用程序中,您需要添加proxyaddress

    <proxy bypassonlocal="False" usesystemdefault="True" proxyaddress="http://127.0.0.1:8888" />
    
  • 当.NET发出请求时(通过服务客户端或HttpWebRequest等),它将始终绕过包含localhost的URL的Fiddler代理,因此您必须使用别名,如机器名称或在“主机”文件中制作一些内容(这就是localhost.fiddlerhttp://HOSTNAME之类的原因)
  • 如果您指定proxyaddress,则必须在未启用Fiddler的情况下将其从配置中删除,或者您的应用发出的任何请求都会引发异常,例如:

      

    无法建立连接,因为目标计算机主动拒绝了它127.0.0.1:8888

  • 不要忘记使用config transformations删除生产中的代理部分

答案 4 :(得分:4)

如此简单,您只需更改配置客户端中的地址:而不是“localhost”更改为计算机名称或IP

答案 5 :(得分:1)

如果您可以控制发送通信的客户端,则这很简单。您需要做的就是在客户端服务类上设置HttpProxy。

例如,我这样做是为了跟踪在智能手机上运行的Web服务客户端。我将客户端连接上的代理设置为Fiddler的IP /端口,该端口在网络上的PC上运行。智能手机应用程序然后通过Fiddler将其所有传出通信发送到Web服务。

这完美无缺。

如果您的客户是WCF客户端,请参阅this Q&A了解如何设置代理。

即使您无法修改客户端应用程序的代码,也可以根据客户端使用的Web服务堆栈以管理方式设置代理。

答案 6 :(得分:0)

我使用wire shark工具监控从浏览器中的银灯应用到服务的服务呼叫。尝试link给出明确的信息

它使您能够监控整个请求和响应内容。

答案 7 :(得分:0)

标准WCF追踪/诊断

如果由于某种原因您无法让Fiddler工作,或者宁愿以其他方式记录请求,则另一种选择是使用标准WCF跟踪功能。这将生成一个具有良好查看器的文件。

<强>文档

请参阅https://docs.microsoft.com/en-us/dotnet/framework/wcf/samples/tracing-and-message-logging

<强>配置

将以下内容添加到您的配置中,确保c:\logs存在,重建并发出请求:

  <system.serviceModel>
    <diagnostics>
      <!-- Enable Message Logging here. -->
      <!-- log all messages received or sent at the transport or service model levels -->
      <messageLogging logEntireMessage="true"
                      maxMessagesToLog="300"
                      logMessagesAtServiceLevel="true"
                      logMalformedMessages="true"
                      logMessagesAtTransportLevel="true" />
    </diagnostics>
  </system.serviceModel>

  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Information,ActivityTracing"
        propagateActivity="true">
        <listeners>
          <add name="xml" />
        </listeners>
      </source>
      <source name="System.ServiceModel.MessageLogging">
        <listeners>
          <add name="xml" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add initializeData="C:\logs\TracingAndLogging-client.svclog" type="System.Diagnostics.XmlWriterTraceListener"
        name="xml" />
    </sharedListeners>
    <trace autoflush="true" />
  </system.diagnostics>

答案 8 :(得分:0)

我刚刚尝试了Brad Rem的第一个答案,并在web.config中的BasicHttpBinding下达到了此设置:

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding bypassProxyOnLocal="False" useDefaultWebProxy="false" proxyAddress="http://127.0.0.1:8888" ...
        ...
      </basicHttpBinding>
    </bindings>
    ...
<system.serviceModel>

希望这对某人有帮助。

答案 9 :(得分:0)

您可以使用免费版本的HTTP调试器。

它不是代理,您无需在web.config中进行任何更改。

它也可以同时显示;传入和传出HTTP请求。 HTTP Debugger Free

答案 10 :(得分:0)

使用 fiddler 反向代理是我的最终解决方案。

首先,使用 REGDIT 将 fiddler 配置为反向代理,如文档所述:https://docs.telerik.com/fiddler/configure-fiddler/tasks/usefiddlerasreverseproxy#configure-fiddler-as-reverse-proxy
1) 单击工具> Fiddler 选项。确保选中允许远程客户端连接
2) 在 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Fiddler2 内新建一个名为 ReverseProxyForPort 的 DWORD。
3) 将 DWORD 设置为 Fiddler 将重新路由入站流量的本地端口。
4) 重启 Fiddler。

二、改客户端通过代理调用服务
例如,这是我的客户端 app.config:

<client>
    <endpoint address="http://localhost:61236/WeatherForecastService.svc"
        binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IWeatherForecastService"
        contract="ServiceReference1.IWeatherForecastService" name="BasicHttpBinding_IWeatherForecastService" />
</client>

更改客户端以使用代理端点地址。

WeatherForecastServiceClient client = new WeatherForecastServiceClient("BasicHttpBinding_IWeatherForecastService", "http://localhost:8888/WeatherForecastService.svc");
var data = client.GetData(1000);
client.Close();

fiddler