传统路由不会反序列化 json 正文请求(ASP.NET 核心 API)



问题

在控制器和操作上使用ApiControllerAttribute和RouteAttribute,一切都很好。

当我更改代码以使用转换路由时,请求中的Identity属性总是设置为null。

带有ApiControllerAttribute的代码(请求中加载了标识(

[ApiController]
[Route("api/[controller]")]
Public Class Main : ControllerBase
{
[HttpPost(nameof(GetExternalRemoteExternal))]
public async Task<GetByIdentityResponse<RemoteExternal>> GetExternalRemoteExternal(GetByIdentityRequest<RemoteExternalIdentity> request)
{
return await GetExternal<RemoteExternal, RemoteExternalIdentity>(request);
}
}

启动.cs

app.UseEndpoints(endpoints => endpoints.MapControllers());

具有转换路由的代码(请求具有空标识(

Public Class Main : ControllerBase
{
[HttpPost]
public async Task<GetByIdentityResponse<RemoteExternal>> GetExternalRemoteExternal(GetByIdentityRequest<RemoteExternalIdentity> request)
{
return await GetExternal<RemoteExternal, RemoteExternalIdentity>(request);
}
}

启动.cs

app.UseEndpoints(endpoints => endpoints.MapControllerRoute(
name: "default",
pattern: "api/{controller}/{action}")) //Not work even with "api/{controller}/{action}/{?id}"

通用代码

public class GetByIdentityRequest<TIDentity> : ServiceRequest
where TIDentity : BaseIdentity
{
public TIDentity Identity { get; set; }
}
public class RemoteExternalIdentity : BaseIdentity
{
public int IdX { get; set; }
}

JSON

{"$id":"1","Identity":{"$id":"2","IdX":10000}}

API链接

.../api/Main/GetExternalRemoteExternal

[ApiController]属性为控制器添加了一些约定,以启用一些固执己见的行为,包括默认情况下使复杂参数从主体绑定的绑定源参数推断。

由于不能在基于约定的路由中使用[ApiController]属性(因为其中一个约定是为了防止这种情况发生(,因此可以在参数中使用显式[FromBody]来强制从JSON主体解析它们:

public class Main : ControllerBase
{
[HttpPost]
public async Task<GetByIdentityResponse<RemoteExternal>> GetExternalRemoteExternal(
[FromBody] GetByIdentityRequest<RemoteExternalIdentity> request)
{
return await GetExternal<RemoteExternal, RemoteExternalIdentity>(request);
}
}

最新更新