【问题标题】:C# HttpClient - PutAsyncC# HttpClient - PutAsync
【发布时间】:2019-07-15 14:33:13
【问题描述】:

我有一个后端控制器方法

[Route("{ropeId}/segments")]
[HttpPut]
public async Task<IActionResult> Put([NotNull] [FromBody] IEnumerable<Segment> segments)
{
    Debug.WriteLine("In here!");
}

我可以在 Rider 中使用便笺本来达到这个水平:

PUT https://localhost:6001/api/ropes/3/segments
Accept: */*
Cache-Control: no-cache
Content-Type: application/json

[{"SegmentNo":1,"RopeId":3,"LastReceived":"2019-12-28T14:34:35.9799039+01:00","BendDamage":0.018,"Temperature":30.0,"LoadLevel":1},
{"SegmentNo":16,"RopeId":3,"LastReceived":"2019-12-28T14:34:35.9799039+01:00","BendDamage":0.018,"Temperature":30.0,"LoadLevel":1}, {"SegmentNo":50,"RopeId":3,"LastReceived":"2019-12-28T14:34:35.9799039+01:00","BendDamage":0.018,"Temperature":30.0,"LoadLevel":1},
{"SegmentNo":69,"RopeId":3,"LastReceived":"2019-12-28T14:34:35.9799039+01:00","BendDamage":0.018,"Temperature":30.0,"LoadLevel":1},
{"SegmentNo":101,"RopeId":3,"LastReceived":"2019-12-28T14:34:35.9799039+01:00","BendDamage":0.018,"Temperature":30.0,"LoadLevel":1},  {"SegmentNo":106,"RopeId":3,"LastReceived":"2019-12-28T14:34:35.9799039+01:00","BendDamage":0.018,"Temperature":30.0,"LoadLevel":1},
{"SegmentNo":128,"RopeId":3,"LastReceived":"2019-12-28T14:34:35.9799039+01:00","BendDamage":0.018,"Temperature":30.0,"LoadLevel":1}]

细分模型:

public sealed class Segment
{
   public Segment(short segmentNo,
                  byte ropeId,
                  DateTime lastReceived,
                  double bendDamage,
                  double temperature,
                  byte loadLevel)
   {
      SegmentNo = segmentNo;
      RopeId = ropeId;
      LastReceived = lastReceived;
      BendDamage = bendDamage;
      Temperature = temperature;
      LoadLevel = loadLevel;
   }

   public short SegmentNo { get; }
   public byte RopeId { get; }
   public DateTime LastReceived { get; }
   public double BendDamage { get; }
   public double Temperature { get; }
   public byte LoadLevel { get; }
}

我无法通过 httpClient PutAsync 调用来实现它。

我试过了:

var httpContent = new StringContent(updatedSegments);
var response = await httpClient.PutAsync(@"https://localhost:6001/api/ropes/3/segments", httpContent);

但我得到一个 SerializeError。

Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
Route matched with {action = "Put", controller = "Ropes"}. Executing action WEBAPI.Controllers.RopesController.Put (WEBAPI)
info: Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor[1]
Executing ObjectResult, writing value of type 'Microsoft.AspNetCore.Mvc.SerializableError'.

我的 PutAsync 调用有什么问题?

就像我说的,这适用于 Postman / PUT 从头开始​​。

如果我这样做

var s = await httpContent.ReadAsStringAsync();
s.Print();

我得到了上面的 JSON,所以我认为问题是我需要在 httpContent 上设置一个标头来告诉它它是 application/json?

【问题讨论】:

  • 尝试像这样在构建 httpContent 时指定内容类型,它对我来说很好用: var httpContent= new StringContent(updatedSegments.ToString(Newtonsoft.Json.Formatting.None), Encoding.UTF8 , "应用程序/json");
  • 成功了,谢谢!

标签: c# .net-core httpclient


【解决方案1】:

您是否尝试在构造函数中为 httpContent 对象指定内容类型?我使用 httpClient 调用并声明该类型对我有用:

var httpContent= new StringContent(updatedSegments.ToString(Newtonsoft.Json.Formatting.None), Encoding.UTF8, "application/json");

让我知道它是否也适合你

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多