HttpClient Head 请求参数始终为 null
HttpClient Head request argument always null
我正在构建一个将用于应用程序更新的 WebAPI 服务,我编写了一个 HEAD 和 GET 方法,它们都采用一个 Version 对象,该对象表示客户端正在升级到的版本。
我已经编写了一个供应用程序使用的客户端,但在请求中传递版本对象时遇到一些问题,我有以下 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
参数始终为 null
,服务方法签名低于
public async Task<HttpResponseMessage> Head(Version version)
{
...
}
谁能解释一下我做错了什么?
编辑:
做了更多分析,我从服务器收到 415 Unsupported Media Type 响应。我添加了 httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");
但没有任何区别,有什么想法吗? (注意:我通过上述方式或按照建议使用 version.ToString()
收到此回复)
根据 parameter binding rules,Web API 仅从 URI 获取 "simple" 类型(字符串、整数、日期时间等)的值,Version
不他们之中。我不相信使用 [FromUri]
属性会起作用,因为 Version
是不可变的(只读属性)所以我认为 Web API 不知道如何绑定它。
所以我认为您唯一的选择是 implement a custom type converter,它允许您明确告诉框架如何将字符串转换为 System.Version
,或者如果您仅在几个动作,保持简单并使用字符串参数类型,并在动作中使用 Version.TryParse
。
我正在构建一个将用于应用程序更新的 WebAPI 服务,我编写了一个 HEAD 和 GET 方法,它们都采用一个 Version 对象,该对象表示客户端正在升级到的版本。
我已经编写了一个供应用程序使用的客户端,但在请求中传递版本对象时遇到一些问题,我有以下 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
参数始终为 null
,服务方法签名低于
public async Task<HttpResponseMessage> Head(Version version)
{
...
}
谁能解释一下我做错了什么?
编辑:
做了更多分析,我从服务器收到 415 Unsupported Media Type 响应。我添加了 httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");
但没有任何区别,有什么想法吗? (注意:我通过上述方式或按照建议使用 version.ToString()
收到此回复)
根据 parameter binding rules,Web API 仅从 URI 获取 "simple" 类型(字符串、整数、日期时间等)的值,Version
不他们之中。我不相信使用 [FromUri]
属性会起作用,因为 Version
是不可变的(只读属性)所以我认为 Web API 不知道如何绑定它。
所以我认为您唯一的选择是 implement a custom type converter,它允许您明确告诉框架如何将字符串转换为 System.Version
,或者如果您仅在几个动作,保持简单并使用字符串参数类型,并在动作中使用 Version.TryParse
。