PUT请求导致400 Bad Request

时间:2012-05-15 22:09:26

标签: c# asp.net-web-api restsharp http-status-code-400 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);
}

然后这是尝试调用这些方法的客户端代码。 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;
}

1 个答案:

答案 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响应,则情况并非如此。