1

我在可移植类库(针对 .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。我发现这个答案说服我尝试使用这样的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 开发人员能够认识到我正在犯的一些明显错误......

4

3 回答 3

0

您可以使用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);
于 2015-02-12T04:19:12.227 回答
0

我的 Windows Phone/Windows 库中,我使用

client.DefaultRequestHeaders.TryAddWithoutValidation()

它工作正常。所以你的

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

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

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

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

于 2015-02-12T14:57:15.717 回答
0

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, "{}");

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

于 2015-02-12T06:06:31.300 回答