情况如下:@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字段绑定一个类所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)