c# - 对象反序列化在 Asp Net Core MVC 控制器中的 POST 失败
问题描述
我创建了一个没有完整 MVC 模板的 API 应用程序。但是,带有正文的 POST 请求总是因内部服务器错误而失败。
对于有状态服务,我在这里遵循了完全相同的步骤:
我在 Visual Studio 中使用 Stateful Service 模板创建了一个项目。我添加了一个 Kestrel 监听器,如下所述:
protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
return new ServiceReplicaListener[]
{
new ServiceReplicaListener(serviceContext =>
new KestrelCommunicationListener(serviceContext, (url, listener) =>
new WebHostBuilder()
.UseKestrel()
.ConfigureServices(
services => services
.AddSingleton<StatefulServiceContext>(serviceContext)
.AddSingleton<IReliableStateManager>(this.StateManager))
.UseContentRoot(Directory.GetCurrentDirectory())
.UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.UseUniqueServiceUrl)
.UseStartup<Startup>()
.UseUrls(url)
.Build()
))
};
}
然后,我添加了一个 Startup 类和一个测试控制器: internal class Startup { public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddMvcCore(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseMvc(); } }
[Route("[controller]")]
[ApiController]
public class MyController : ControllerBase
{
[HttpGet("Read1")]
public async Task<ActionResult<string>> Read1()
{
return "asd";
}
[HttpPost("Read2")]
public async Task<ActionResult<string>> Read2()
{
return "asd";
}
[HttpPost("Read3")]
public async Task<ActionResult<MyOutput>> Read([FromBody]MyInput input)
{
var a = new MyOutput();
a.Value= "asdasd";
return a;
}
}
using System.Runtime.Serialization;
[DataContract]
public class MyInput
{
[DataMember]
public string Value{ get; }
public MyInput(string val)
{
Value= val;
}
}
当我向这 3 个端点发出请求时,/Read1 和 /Read2 请求工作正常。但是,/Read3 请求失败,客户端出现内部服务器错误,我试图在控制器中放置一个断点,但对于 /Read3 它永远不会命中它。这让我觉得反序列化不起作用。
我从 Insomnia 发送请求。一个简单的 POST 请求,其内容类型标头设置为“application/json”和 JSON 正文:
{
"Value": "cat"
}
这可能是什么原因造成的?
解决方案
就我而言,我错过了 json 格式化程序:
services.AddMvcCore().AddJsonFormatters();
也许它可以帮助某人。
推荐阅读
- android - 在 Android 中显示来自 Firebase 的所有数据
- python - TensorFlow 没有正式命名的模块
- javascript - 'jQuery' 未定义 no-undef
- javafx - JavaFX - 测试 GridPane 单元格是否为空时出现 InvocationTargetException
- java - Java ExecutorService 顺序-Spring MVC
- php - 尽管启用了mbstring,但调用未定义的函数mb_convert_encoding()
- java - Drools - 使用 java 常量作为 drools 规则名称
- nginx - 使用 nginx map 指令动态设置代理上游
- c - Visual Studio - C 编程
- java - 将 JSON 值从 PHP 获取到 Android