使用 fiddler 捕获 Windows 商店应用程序流量引发异常

Posted

技术标签:

【中文标题】使用 fiddler 捕获 Windows 商店应用程序流量引发异常【英文标题】:capturing windows store app traffic with fiddler raises an exception 【发布时间】:2013-05-22 15:08:26 【问题描述】:

我已尝试在 Windows 应用商店应用程序上发送 POST 请求。我已经尝试使用 Fiddler 或 Charles 来捕捉它。

关闭 Fiddler/Charles 后,一切正常。 打开 Fiddler/Charles 后,PostAsync() 引发异常

这是我的尝试:

Uri uri = new Uri("http://example.com");
using (StringContent content = new StringContent("", Encoding.UTF8, "application/json"))

    using (HttpClient client = new HttpClient())
    
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.DefaultRequestHeaders.Host = uri.Host;
        try
        
            using (HttpResponseMessage response = await client.PostAsync(uri, content))
            
                if (response.IsSuccessStatusCode)
                
                    String result = await response.Content.ReadAsStringAsync();
                    return result;
                
                return null;
            
        
        catch (Exception ex)
        
            return null;
        
    

为什么我无法使用 fiddler 或 Charles 来分析流量?这是我得到的例外:

Data    System.Collections.ListDictionaryInternal System.Collections.IDictionary System.Collections.ListDictionaryInternal
HelpLink    null    string
HResult -2146233088 int
InnerException  "The underlying connection was closed: Unable to connect to the remote server."   System.Exception System.Net.WebException
IPForWatsonBuckets  206848215   System.UIntPtr
IsTransient false   bool
Message "An error occurred while sending the request."  string
RemoteStackTrace    null    string
Source  "mscorlib"  string
StackTrace  "   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   at Example.Services.ExampleServices.<ExampleClass>d__3.MoveNext() in c:\\TFS\\Example\\ExampleMain\\Example\\Services\\ExampleServices.cs:line 110"   string
TargetSite  Void Throw()  System.Reflection.MethodBase System.Reflection.RuntimeMethodInfo
WatsonBuckets   null    object

【问题讨论】:

【参考方案1】:

我找到了问题的根源和解决方案:不得手动定义 Host 标头,以便请求在 Fiddler 或 Charles 处于活动状态的环境中工作。

这意味着我们必须删除或注释掉以下行:

client.DefaultRequestHeaders.Host = uri.Host;

通过不自己设置 Host,您的应用将神奇地再次使用本地代理运行,并且框架将自行设置 Host 标头。

这对于那些可能按照最近的微软指南做错的人来说很有用: http://blogs.msdn.com/b/wsdevsol/archive/2013/02/05/how-to-use-httpclient-to-post-json-data.aspx

【讨论】:

令人着迷。这可能来自尝试支持使用 HOST 标头来控制独立于 URL 主机的 DNS 解析的可怕模式(这在 RFC2616 下是非法的)。跟进 .NET 团队。 你知道为什么请求失败吗?您的环境是否需要其他代理? @EricLaw 我能提供的最好的是问题中的异常详细信息。不,我没有任何其他代理,并且 Windows 防火墙已关闭。一位朋友甚至在另一台计算机上尝试过,但还是同样的问题。 感谢您的解决方案!!正在把我的头撞到墙上,试图弄清楚为什么它在没有 Fiddler 运行的情况下工作!【参考方案2】:

您是否忘记为您的应用程序授予AppContainer Loopback exemption?

您是否忘记将机器配置为信任 Fiddler 的根证书?

【讨论】:

我没有忘记这两个设置中的任何一个。问题出在其他地方:如果您需要本地代理,似乎禁止自己配置 DefaultRequestHeaders.Host。看我的回答。

以上是关于使用 fiddler 捕获 Windows 商店应用程序流量引发异常的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中捕获 Windows 应用商店应用程序的窗口内容

获取 windows 商店内的 aapx 安装包 并 安装(旁加载)

WASAPI + windows 商店应用初始化

fiddler安装和使用

怎样通过fiddler抓包定位前后端的问题

fiddler的安装与使用使用fiddler捕获会话信息