2

アプリケーションの更新に使用される WebAPI サービスを構築しています。クライアントがアップグレードするバージョンを示す Version オブジェクトを取得する HEAD メソッドと GET メソッドを記述しています。

アプリケーションが使用するクライアントを作成しましたが、リクエストでバージョン オブジェクトを渡す際にいくつかの問題があります。HEAD リクエストには次のように記述します。

var httpClient = this.CreateHttpClient(this.ServiceBaseAddress, handler);
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");

JsonSerializerSettings settings = new JsonSerializerSettings
                                        {
                                            NullValueHandling = NullValueHandling.Ignore
                                        };
var serializedVersion = JsonConvert.SerializeObject(version, settings);

var requestUri = string.Format(
    "{0}{1}/?version={2}",
    this.ServiceBaseAddress,
    this.AddressSuffix,
    serializedVersion);

var request = new HttpRequestMessage(HttpMethod.Head, requestUri);
if (from.HasValue)
{
    request.Headers.Range = new RangeHeaderValue(from, to);
}
var response = await httpClient.SendAsync(request);

今、私がデバッグしているとき。サービス メソッドのブレークポイントに到達しましたが、versionパラメーターは alwaysnullです。サービス メソッドのシグネチャは以下のとおりです。

public async Task<HttpResponseMessage> Head(Version version)
{
...
}

誰かが私が間違っていることを説明できますか?

編集: さらに分析を行ったところ、サーバーから 415 Unsupported Media Type 応答が返されました。追加しましhttpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");たが、違いはありません。アイデアはありますか?(注:上記の方法で、またはversion.ToString()提案どおりに使用して、この応答を取得しています)

4

1 に答える 1

1

パラメーター バインディング ルールに従って、Web API は「単純な」型 (string、int、DateTime など) の URI からのみ値を取得し、Versionその中には含まれません。不変(読み取り専用プロパティ)であるため、[FromUri]属性の使用が機能するとは思わないため、Web APIはそれをバインドする方法を知らないと思います。Version

だから私はあなたの唯一のオプションはカスタム型コンバーターを実装することだと思いますSystem.Version.文字列パラメータ タイプでVersion.TryParse、アクション内で使用します。

于 2015-08-17T11:34:51.700 に答える