【问题标题】:Custom accept header not working on Windows Phone 8自定义接受标头在 Windows Phone 8 上不起作用
【发布时间】:2015-02-12 03:44:12
【问题描述】:

我在可移植类库(面向 .NET 4.5 和 Windows Phone 8.1)中有一个类,它使用 HttpClient (System.Net.Http.HttpClient) 类将字符串发布到 Web 服务。该服务要求我在请求中设置 Accept 标头以指定 API 版本,如下所示:

Accept: vnd.servicehost.v1+json

我在课堂上这样尝试过:

_httpClient.DefaultRequestHeaders.Add("Accept", "vnd.servicehost.v1+json");

它会抛出一个 FormatException,指出我的 Accept 标头无效。所以我尝试这样设置:

_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("vnd.servicehost.v1+json"));

它仍然会抛出 FormatException。我发现this answer 说服我尝试使用TryAddWithoutValidation() 方法,如下所示:

_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "vnd.servicehost.v1+json");

最后,我没有收到 FormatException!当我从我的 .NET 4.5 单元/集成测试项目中调用它时,我的 post 方法有效。我得到了 200 和我期望的数据。但是,当我从 Windows Phone 8.1(或模拟器)调用相同的方法时,服务会响应并告诉我我在请求中指定的版本无效。

我不知道如何让 Fiddler 向我显示来自我的 Windows Phone 模拟器的流量,以查看实际请求的样子。我的猜测是永远不会添加 Accept 标头。我希望经验丰富的 Windows Phone 开发人员能够识别出我正在犯的一些明显错误……

【问题讨论】:

    标签: c# windows-phone-8 windows-runtime .net-4.5 http-accept-header


    【解决方案1】:

    您可以使用Windows.Web.Http.HttpClient 代替System.Net.Http.HttpClient,即:

    HttpClient _httpClient = new HttpClient();
    bool result = _httpClient.DefaultRequestHeaders.TryAppendWithoutValidation("Accept", "vnd.servicehost.v1+json");
    var response = await _httpClient.GetAsync(uri);
    

    【讨论】:

    • 感谢您的建议。我认为我在面向 .NET 4.5 时无法访问 Windows.Web.Http.HttpClient。
    【解决方案2】:

    windows phone 8 中使用WebClient 可以这样:

            WebClient clt = new WebClient();
            clt.Headers["Content-Type"] = "application/json";
            clt.Headers["Accept"] = "vnd.servicehost.v1+json";
            clt.UploadStringAsync(new Uri(uri, "{}");
    

    注意:我不确定,因为我没有测试过,但你可以试试

    【讨论】:

    • 感谢您的建议。我认为我在面向 Windows Phone 8.1 时无法访问 WebClient。
    【解决方案3】:

    my Windows Phone/Windows library我使用

    client.DefaultRequestHeaders.TryAddWithoutValidation()
    

    而且效果很好。所以你的

    _httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "vnd.servicehost.v1+json");
    

    应该也可以。唯一确定的方法是查看从手机到服务器的实际流量。

    让 Fiddler 与模拟器一起工作并非易事(我从未完成过),但从实际设备捕获流量非常容易。

    在 Fiddler 的设置中,您必须允许远程连接并重新启动 Fiddler。然后在设备中,确保您连接到与计算机相同的网络,并在 WiFi 设置中将代理服务器设置为 your_computer_ip:8888。现在所有的流量都应该通过 Fiddler,你会看到 http 请求是否正常。

    【讨论】:

    • 伊戈尔,感谢您的建议。我似乎无法让您的代理解决方案正常工作。我已经按照您的描述设置了 Fiddler。我已经尝试更改端口以防发生碰撞或那里发生什么事情。我已尝试关闭计算机上的防火墙。
    猜你喜欢
    • 1970-01-01
    • 2014-05-27
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多