1

HttpClient (System.Net.Http.HttpClient) クラスを使用して Web サービスに文字列をポストするポータブル クラス ライブラリ (.NET 4.5 および Windows Phone 8.1 を対象とする) にクラスがあります。このサービスでは、リクエストにAcceptヘッダーを設定して、次のように API バージョンを指定する必要があります。

Accept: vnd.servicehost.v1+json

私はこのように私のクラスでこれを試しました:

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

また、Accept ヘッダーが無効であることを示す FormatException がスローされます。だから私はこのように設定してみます:

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

そして、それでも FormatException がスローされます。この回答を見つけて、次のTryAddWithoutValidation()ような方法を試してみることにしました。

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

最後に、FormatException を受け取りません。post メソッドは、.NET 4.5 ユニット/統合テスト プロジェクト内から呼び出すと機能します。期待していたデータで 200 を返します。しかし、Windows Phone 8.1 (またはエミュレーター) から同じメソッドを呼び出すと、サービスは、要求で指定したバージョンが無効であることを通知する応答を返します。

Fiddler で Windows Phone エミュレーターからのトラフィックを表示して、実際の要求がどのように見えるかを確認する方法がわかりません。私の推測では、Accept ヘッダーは追加されません。ベテランの Windows Phone 開発者が、私が犯している明らかな間違いを認識できることを願っています...

4

3 に答える 3

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.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 に答える