自定义接受标头不适用于Windows Phone 8

时间:2015-02-12 03:44:13

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

我在可移植类库(针对.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开发人员能够识别出我犯的一些明显错误...

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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, "{}");

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

答案 2 :(得分:0)

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请求看起来不错,你会看到。