ind*_*rad 3 c# restsharp http-status-code-400 asp.net-web-api dotnet-httpclient
我正在尝试使用 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);
}
Run Code Online (Sandbox Code Playgroud)
这是尝试调用这些方法的客户端代码。POST 请求如下所示:
var client = new HttpClient();
var content = log.ToJsonContent();
var address = new Uri(_webApiBaseAddress + "logs");
client.PostAsync(address, content).ContinueWith(requestTask =>
{
requestTask.Result.EnsureSuccessStatusCode();
});
Run Code Online (Sandbox Code Playgroud)
不起作用的 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();
});
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我已经尽可能地精简了功能,但每次 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);
Run Code Online (Sandbox Code Playgroud)
这样做的问题是,我使用 AddObject 传入的任何对象在到达控制器方法时最终都只是一个字符串。如果我传入一个 int,我想要得到一个 int。HttpClient 使用 POST 方法执行此操作,因此我想使用该方法,但 PUT 会引发错误。因此,我陷入了两个半工作解决方案的困境,不幸的是,这两个解决方案并不能构成一个完整的解决方案。我希望得到有关这两种模式的反馈,以使其发挥作用。
编辑:
因为下面提到了,这是我的.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;
}
Run Code Online (Sandbox Code Playgroud)
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();
});
Run Code Online (Sandbox Code Playgroud)
注意,我application/json作为参数提供。我知道如果 Web API 不知道您的请求所在的媒体类型,它会做出疯狂的事情。您的 RestClient 测试确实有效,这一事实让我认为您发送的 JSON 无效。
可能对您有帮助的第二部分是,如果您在控制台应用程序之类的东西中测试这一点,该应用程序可能会在异步调用真正初始化和发送之前关闭,您将不会得到响应。.Wait()您可以通过在您的后面加上 来测试这一点,ContinueWith但我怀疑如果您实际上收到 400 响应,情况并非如此。