我正在尝试使用HttpClient对Web API方法执行PUT请求。几乎相同的POST请求按预期工作,但PUT请求导致400(错误请求)错误。我不确定我做错了什么。
这是我的Web API控制器代码:
public HttpResponseMessage Post(object val)
{
Debug.WriteLine(val.ToString());
return new HttpResponseMessage(HttpStatusCode.OK);
}
public HttpResponseMessage Put(int id, object val)
{
Debug.WriteLine(id.ToString(), val.ToString());
return new HttpResponseMessage(HttpStatusCode.OK);
}
然后这是尝试调用这些方法的客户端代码。 POST请求如下所示:
var client = new HttpClient();
var content = log.ToJsonContent();
var address = new Uri(_webApiBaseAddress + "logs");
client.PostAsync(address, content).ContinueWith(requestTask =>
{
requestTask.Result.EnsureSuccessStatusCode();
});
不起作用的PUT请求如下所示:
var client = new HttpClient();
var content = log.ToJsonContent();
var address = new Uri(_webApiBaseAddress + "logs/" + jobId);
client.PutAsync(address, content).ContinueWith(requestTask =>
{
requestTask.Result.EnsureSuccessStatusCode();
});
正如你所看到的那样,我已经将功能删除,因为我可以获得它,并且每次仍然会收到PUT请求的错误。
顺便说一句,我可以使用RestSharp客户端成功发出PUT请求。此代码成功调用API方法:
var client = new RestClient(_webApiBaseAddress);
var request = new RestRequest("logs/{id}", Method.PUT);
request.AddUrlSegment("id", jobId.ToString());
request.AddObject(log);
client.Execute(request);
这样做的问题是,我使用AddObject传递的任何对象在到达控制器方法时最终都是一个字符串。如果我传入一个int,我想获得一个int。 HttpClient使用POST方法执行此操作,因此我想使用它,但PUT会抛出错误。因此,我坚持使用2个半工作解决方案,遗憾的是,这些解决方案并没有达到完整的解决方案。我希望得到关于这两种模式的反馈,以使其发挥作用。
修改
因为下面提到过,这是我的.ToJsonContent()
扩展方法:
public static StringContent ToJsonContent(this object obj)
{
var converter = new IsoDateTimeConverter();
converter.DateTimeStyles = DateTimeStyles.AdjustToUniversal;
var json = JsonConvert.SerializeObject(obj, converter);
var content = new StringContent(json, Encoding.UTF8, "application/json");
return content;
}
答案 0 :(得分:4)
您写的是ToJsonContent
功能吗?如果是这样,可能值得一看,以确保您提供正确的Content-Type并生成正确的JSON格式。要消除JSON是问题,你可以做这样的测试:
var client = new HttpClient();
var content = new StringContent(
@"{""message"": ""this is a log message"" }",
Encoding.UTF8,
"application/json");
var address = new Uri(_webApiBaseAddress + "logs/" + jobId);
client.PutAsync(address, content).ContinueWith(task =>
{
task.Result.EnsureSuccessStatusCode();
});
Noice我提供application/json
作为参数。我知道如果Web API不知道您的请求属于哪种媒体类型,那么它就会很疯狂。您的RestClient测试 工作的事实让我觉得您发送的JSON无效。
可能对您有所帮助的第二部分是,如果您在控制台应用程序中进行测试,可能会在异步调用真正初始化并发送之前关闭,您将无法获得响应。您可以通过在.Wait()
之后添加ContinueWith
来测试这一点,但我怀疑如果您实际上得到了400响应,则情况并非如此。