我在可移植类库(针对.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开发人员能够识别出我犯的一些明显错误...
答案 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请求看起来不错,你会看到。