【问题标题】:capturing windows store app traffic with fiddler raises an exception使用 fiddler 捕获 Windows 商店应用程序流量引发异常
【发布时间】: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

【问题讨论】:

    标签: windows-8 visual-studio-2012 windows-store-apps fiddler charles-proxy


    【解决方案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。看我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    相关资源
    最近更新 更多