簡體   English   中英

C# HttpClient - PutAsync

[英]C# HttpClient - PutAsync

我有一個后端控制器方法

[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 scratch。

如果我做

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

我得到了上面的 JSON,所以我認為問題是我需要在 httpContent 上以某種方式設置一個標頭來告訴它它是 application/json?

您是否嘗試在構造函數上為 httpContent 對象指定內容類型? 我使用 httpClient 調用並聲明該類型對我有用,如下所示:

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

讓我知道它是否也適合你

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM