HttpClient REST API PUT请求返回代码500



我使用一些web服务器的REST API来控制各种设备之间的数据交换。我使用HttpClient类在c#应用程序中实现我的想法,GET, DELETE, POST请求工作完美。然而,一些API函数需要PUT请求提供JSON/字符串数据作为内容,在这种情况下,我得到错误500(内部服务器错误)。

public class RegBank
{
public int Address { get; set; }
public int NumRegisters { get; set; }
}    

// static HttpClient obj instantiated at the beginning of the app 
public static httpClient = new HttpClient();

...

// create an object and serialize into JSON string
var obj = new RegBank {Address = 0x40, NumRegisters = 123};
string jsonStr = JsonConvert.SerializeObject(obj); // using Newtonsoft.Json library

// compose HttpRequestMessage
var request = new HttpRequestMessage(HttpMethod.Put, url);
request.Headers.TryAddWithoutValidation("X-Auth-Token", "token");
request.Headers.TryAddWithoutValidation("X-Auth-User", "user");
request.Content = new StringContent(jsonStr, Encoding.UTF8, "application/json");

response = await httpClient.SendAsync(request); // yields Error 500

如果我注释掉request.Content = new StringContent(jsonStr, Encoding.UTF8, "application/json");行,服务器响应错误400,这表明服务器是活的,身份验证通过,但数据丢失。有趣的是,当在类似的条件下(权限、内容)执行POST请求时,它们完全成功。

只是为了确认服务器本身处理这样的请求,我也尝试使用Python执行相同的操作,它工作得很好

response = requests.put(
url,
headers={'X-Auth-Token': "token", 'X-Auth-User': "user", "Content-Type": "application/json"},
json= { "Address" : 0x40, "NumRegisters" : 123 }
)

在配置HttpClient或HttpRequestMessage时我错过了什么?谢谢。

服务器似乎在处理它,然而它是一个内部服务器错误,这似乎是处理数据的一些问题,您可以尝试在json中添加0x40引号,如字符串。也尝试json使用PUT请求只有一个参数更新,这是numberRegister看看其数据类型问题。

张贴我的问题的答案。真正的原因,就像其他人提出的那样,仍然是错误地准备了StringContent对象。

我使用HttpToolkit将Python代码发送的请求数据与c#代码发送的请求数据进行比较,找出差异。