【问题标题】:net Core 3.1 Object null in WebApi method after PostAsJsonAsync在 PostAsJsonAsync 之后的 WebApi 方法中的 net Core 3.1 Object null
【发布时间】:2021-03-16 04:09:45
【问题描述】:

我使用这一行来使用 API post 方法

 var postTask = client.PostAsJsonAsync("AgregarNegocio", new StringContent(JsonConvert.SerializeObject(model).ToString(), Encoding.UTF8, "application/json"));

但是当 API 方法被命中时

public IActionResult AgregarNegocio([FromBody]NegocioViewModel model) 

模型中的所有属性都为空... 我已经尝试过使用和不使用 [FromBody] 和其他解决方案,但都没有奏效,有什么建议吗?谢谢!

【问题讨论】:

  • 因为您没有发布 json...您正在发布一个字符串... PostAsJsonAsync 应该将您的对象转换为 json...您不需要自己转换它所以我很确定您是什么发送与 NegocioViewModel 不匹配...您需要做的是摆脱 StringContent 及其中的所有内容,并按原样传递您的模型
  • @JonathanAlfaro 感谢您的回复,HttpClient 无法按原样发送我的 NegocioViewModel 对象,您知道我该怎么做吗?谢谢!
  • 你已经在使用 PostAsJsonAsync 它应该允许你发送一个对象
  • 如果你的意思是这样的 var postTask = client.PostAsJsonAsync("AgregarNegocio", model);那是我写的第一个代码,它甚至没有访问 web api,有什么可能的原因吗? RequestUri:'.../AgregarNegocio',版本:1.1,内容:System.Net.Http.ObjectContent`1[..NegocioViewModel],标头:{ Request-Id:|9d11fffd-49d88077a7dffa67.1。传输编码:分块内容类型:应用程序/json;字符集=utf-8 }}
  • 这就是你发送它的方式。您还需要确保您的 Action 是后端的 HttpPost

标签: asp.net-core webapi


【解决方案1】:

你需要像这样构建你的http客户端:

_client = new HttpClient { BaseAddress = new Uri("your http://my base url goes here"), 
                           Timeout = new TimeSpan(0, 0, 0, 0, -1) };

_client.DefaultRequestHeaders.Accept.Clear();
_client.DefaultRequestHeaders.Accept.Add(
                     new MediaTypeWithQualityHeaderValue("application/json"));//add json header
//_client.DefaultRequestHeaders.Add("Bearer", "some token goes here");

你需要像这样调用你的方法:

var postTask = await _client.PostAsJsonAsync("AgregarNegocio", model);

确保你在它上面调用“await”,因为它是异步的。

注意事项:

请注意,我添加了 MediaTypeWithQualityHeaderValue 以表明它是 json。

另外使用Route通常不是一个好主意...最好使用HttPost("MyRoute"),因为它结合了ControllerName + Route。但这取决于你。

【讨论】:

  • 这在我只发送文本时有效,如果我的模型包含 IFormFile 怎么办?当尝试发送此属性以便在 webapi 端以表单上传图像时,它会引发错误,有什么建议吗?感谢您的回答!
  • 这是该类包含的一些属性 public long Id { get;放; } 公共字符串 Nombre { 获取;放; } 公共字符串描述 { 获取;放; } 公共 IFormFile 徽标 { 获取;放; } 发送 IFormFile 时它不起作用,有什么建议吗?
  • IFormFile 无法在 Json 中发送,因为它是某种流......您需要做的是在单独的调用中或在表单发布中上传文件。拥有 IFormFile 后,您必须将其转换为 byte[],这可以是 Logo 属性,例如 public byte[] Logo {get;set;}
  • 所以基本上IFormFile不能作为json发送,首先需要转换成byte[]
  • 知道了,实际上我正在这样做(在 Web 应用程序站点上上传图像并从那里获取字节),但我试图查看是否可以将 ViewModel 中的 IFormFile 发送到WebAPI,无论如何你帮了我很多,我很感激,谢谢!
【解决方案2】:

尝试使用PostAsync 而不是PostAsJsonAsync

var postTask = await client.PostAsync("AgregarNegocio", new StringContent(JsonConvert.SerializeObject(model), Encoding.UTF8, "application/json"));

【讨论】:

  • 我之前试过,甚至没有点击 web api,它抛出“内部服务器错误” RequestMessage = {Method: POST, RequestUri: '.../AgregarNegocio', Version: 1.1, Content :System.Net.Http.StringContent,标头:{ 请求 ID:|d040ca6a-4f2bc1853b68983e.1。内容类型:应用程序/json; charset=utf-8 内容长度...
【解决方案3】:

您可以使用 HttpClient 扩展方法: https://docs.microsoft.com/en-us/previous-versions/aspnet/hh944682(v=vs.118)

PostAsJsonAsync( 这个 HttpClient 客户端, 字符串 requestUri, T值 )

var postTask = client.PostAsJsonAsync<NegocioViewModel>("AgregarNegocio", model);

【讨论】:

  • 与上面的答案相同,我在一开始就尝试过,它甚至没有点击 web api,{Method: POST, RequestUri: '.../AgregarNegocio', Version: 1.1, Content: System .Net.Http.ObjectContent`1[....NegocioViewModel],标头:{ 请求 ID:|9d11fffd-49d88077a7dffa67.1。传输编码:分块内容类型:应用程序/json;字符集=utf-8 }}
【解决方案4】:

您可以使用PostAsync,但也不要忘记以我在this article 中描述的正确方式使用HttpClient。

【讨论】:

  • 有英文版的吗?
  • @EMILIOZARATE 我错了,我翻译了这篇文章,你可以看英文版。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多