我正在构建一个将用于应用程序更新的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()
建议)
答案 0 :(得分:1)
根据parameter binding rules,Web API仅从“简单”类型(字符串,整数,日期时间等)的URI中获取值,Version
不在其中。我不相信使用[FromUri]
属性会起作用,因为Version
是不可变的(只读属性)所以我不认为Web API会知道如何绑定它。
所以我认为您唯一的选择是implement a custom type converter,它允许您明确告诉框架如何将字符串转换为System.Version
,或者如果您只在一对中使用它操作,保持简单并使用字符串参数类型,并在操作中使用Version.TryParse
。