c# – ASP.NET Core FromBody模型绑定:使用Interafece字段绑定一个类

c# – ASP.NET Core FromBody模型绑定:使用Interafece字段绑定一个类,第1张

概述我一直在苦苦挣扎,我发现了一些问题,但没有人能满足我的需求.我会尝试发布一个更好的问题和一些我尝试过的事情. 情况如下: 我有一个APIGateway和一个WebApp.到目前为止,WebApp向APIGateway发送了POST请求.我使用FromBody属性发送更大的对象,这也很好,直到我介绍接口:)) 这是一些代码: Web应用程序: public interface ICommand{ 我一直在苦苦挣扎,我发现了一些问题,但没有人能满足我的需求.我会尝试发布一个更好的问题和一些我尝试过的事情.

情况如下:@H_404_10@我有一个APIGateway和一个WebApp.到目前为止,WebApp向APIGateway发送了POST请求.我使用FromBody属性发送更大的对象,这也很好,直到我介绍接口:))

这是一些代码:

Web应用程序:

public interface ICommand{    GuID CorrelationID { get; set; }    GuID SocketID { get; set; }}public class Command : ICommand{           public Command(GuID CorrelationID,GuID SocketID)    {        this.CorrelationID = CorrelationID;        this.socketID = SocketID;    }    public GuID CorrelationID { get; set; } = new GuID();    public GuID SocketID { get; set; } = new GuID();}    public interface Idocument{    GuID ID { get; set; }    ulong Number { get; set; }}public class document : Idocument{    public GuID ID { get; set; } = new GuID();    public ulong Number { get; set; } = 0;}public interface ICreatedocumentCommand : ICommand{    Idocument document { get; set; }}public class  CreatedocumentCommand : Command,ICreatedocumentCommand{    public CreatedocumentCommand(Idocument document,ICommand Command) : base(Command.CorrelationID,Command.socketID)    {        this.document = document;    }    public Idocument document { get; set; }}

APIGateway:

[httpPost]public async Task<IActionResult> Create([FromBody]CreatedocumentCommand documentCommand){    if (documentCommand == null)    {       return StatusCode(403);    }    return Json(documentCommand.document.ID);}

使用案例:

public class InventoryList : document{    public GuID WarehouseID { get; set; } = new GuID();}// Example document class////////////////////////////////////////// Example POST RequestICommand command = new Command(messageID,socketID);switch (item.GetType().name){    case "InventoryList":    command = new CreatedocumentCommand((InventoryList)item,command);    break;}string result = await PostAsync($"{APIGatewayAddress}{item.GetType().BaseType.name}/Create",command,accesstoken);

我的POST发送功能:

public async Task<string> PostAsync<T>(string uri,T item,string authorizationToken = null,string authorizationMethod = "Bearer"){    JsonSerializerSettings JsonSerializerSettings = new JsonSerializerSettings { TypenameHandling = TypenameHandling.All };    httpRequestMessage requestMessage = new httpRequestMessage(httpMethod.Post,uri);    requestMessage.headers.Accept.Add(new MediaTypeWithQualityheaderValue("application/Json"));     requestMessage.Content = new StringContent(JsonConvert.SerializeObject(item,typeof(T),JsonSerializerSettings),System.Text.EnCoding.UTF8,"application/Json");    return await _clIEnt.SendAsync(requestMessage).Result.Content.ReadAsstringAsync();}

如您所见,我在JsON序列化设置中包含了TypenameHandling.All,发送请求并调用APIGateway中的Create.但是参数documentCommand为NulL.

我读过这个:Asp.Net Core Post FromBody Always Null

这个:ASP.NET Core MVC – Model Binding : Bind an interface model using the attribute [FromBody] (BodyModelBinder)

这个:Casting interfaces for deserialization in JSON.NET

尝试了各种魔术技巧,创建了新的构造函数,用[JsONConstructor]标记它们,仍然没有成功.此外,我尝试将APIGateway Cerate方法参数类型更改为ICreatedocumentCommand,并再次获得null.我一直在网上搜索一些模型绑定技巧但是我找不到任何与FromBody绑定的东西.我也找到了一些解决方案,包括DI,但我正在寻找一个简单的解决方案.我希望我们能找到一个:)

解决方法 事实证明,将接口或类作为JsON传递给内部并不容易.我添加了一个自定义的JsONConverter,现在可以使用了! 总结

以上是内存溢出为你收集整理的c# – ASP.NET Core FromBody模型绑定:使用Interafece字段绑定一个类全部内容,希望文章能够帮你解决c# – ASP.NET Core FromBody模型绑定:使用Interafece字段绑定一个类所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1239769.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存