我最近对 WebAPI 应用程序有过类似的体验。该应用程序在我的测试环境中运行正常,但是当我们从构建服务器运行构建时,应用程序无法反序列化对象并且始终将 [FromBody] 后面的参数设置为 null。
根本原因是 web.config 和 packages.config 指定了 Json.NET 6.0.4,而 bin 中的 NuGet 包是 10.0.3。
模型绑定一开始从外面看起来像一个黑盒子。尤其是因为它可以悄悄地返回一个空值,而不会指出什么是错误的。在此Microsoft 页面上,标题为测试对象序列化下有一个如何测试序列化和反序列化的示例:
string Serialize<T>(MediaTypeFormatter formatter, T value)
{
// Create a dummy HTTP Content.
Stream stream = new MemoryStream();
var content = new StreamContent(stream);
/// Serialize the object.
formatter.WriteToStreamAsync(typeof(T), value, stream, content, null).Wait();
// Read the serialized string.
stream.Position = 0;
return content.ReadAsStringAsync().Result;
}
T Deserialize<T>(MediaTypeFormatter formatter, string str) where T : class
{
// Write the serialized string to a memory stream.
Stream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
writer.Write(str);
writer.Flush();
stream.Position = 0;
// Deserialize to an object of type T
return formatter.ReadFromStreamAsync(typeof(T), stream, null, null).Result as T;
}
// Example of use
void TestSerialization()
{
var value = new Person() { Name = "Alice", Age = 23 };
var xml = new XmlMediaTypeFormatter();
string str = Serialize(xml, value);
var json = new JsonMediaTypeFormatter();
str = Serialize(json, value);
// Round trip
Person person2 = Deserialize<Person>(json, str);
}
当我将上面的代码放入我的应用程序并运行它时,Visual Studio 在序列化和反序列化函数中都抛出了异常。异常清楚地表明加载 Json.net 版本 6.0.4 失败。这让我发现 10.0.3 版本在 bin 而不是 6.0.4 中。我右键单击项目,在上下文菜单中单击管理 NuGet 包...。然后删除并重新添加了 Json.net NuGet 包。这样做会在 bin 中设置 Json.net NuGet 包,并使用匹配的版本号更新 packages.config 和 web.config。