【问题标题】:HttpClient Head request argument always nullHttpClient Head 请求参数始终为空
【发布时间】:2015-08-13 21:01:46
【问题描述】:

我正在构建一个用于应用程序更新的 WebAPI 服务,我编写了一个 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参数始终为null,服务方法签名如下

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

谁能解释我做错了什么?

编辑: 做了更多分析,我从服务器收到 415 Unsupported Media Type 响应。我添加了httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");,但没有区别,有什么想法吗? (注意:我收到以上回复或建议使用version.ToString()

【问题讨论】:

  • 检查到达服务器的实际 URL 并查看版本查询参数是否存在。
  • And... Btw... Json 序列化对象不是查询字符串参数的好候选者。他们往往有各种非法字符。 version.ToString() 怎么样?

标签: c# asp.net-web-api httpclient http-head


【解决方案1】:

根据parameter binding rules,Web API 仅从 URI 中获取“简单”类型(字符串、int、DateTime 等)的值,Version 不在其中。我不相信使用[FromUri] 属性会起作用,因为Version 是不可变的(只读属性),所以我认为Web API 不知道如何绑定它。

所以我认为您唯一的选择是implement a custom type converter,它允许您明确告诉框架如何将字符串转换为System.Version,或者如果您只在几个操作中使用它,请保留它很简单,使用字符串参数类型,并在操作中使用Version.TryParse

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 2021-02-01
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 2017-05-12
    • 2015-09-08
    相关资源
    最近更新 更多