如何在接收 Web api 方法时传递 JSON 字符串使用 HttpClient 接受强类型参数?

How to pass JSON string when receiving Web api method is accepting strongly typed parameter using HttpClient?

我正在尝试弄清楚如何以字符串格式 POST JSON 到 Web api 2 方法,该方法在 c# 消费应用程序中接受强类型对象。

这是我的 POST 方法签名 我知道 api 并不是真正的 REST 完整版,但它是由外部供应商团队维护的,我对它没有太多控制权。

[HttpPost]
[Route("jobs/isrunning")]
public IHttpActionResult IsJobRunning(JobArguments jobArguments)
{
   // some logic

   return Ok(true);
}

这是 JobArguments class 的样子

public class JobArguments
{
    public JobArguments()
    {
        TrackingIds = new List<int();
    }
    public int JobId { get; set; }
    public string Code { get; set; }
    public List<int> TrackingIds { get; set; }
    public string CostCenter { get; set; }
}

这是我在 api 上面调用的 class。假设我无权访问此处的 JobArguments 类型。我所拥有的只是 JobArguments 对象的 JSON 字符串表示形式。

public bool CheckIfJobIsRunning()
{
   HttpClient httpClient = new HttpClient("appurl");
   httpClient.DefaultRequestHeaders.Accept.Add(new 
        MediaTypeWithQualityHeaderValue("application/json"));

    string jobArguments = @"{ ""JobId"": 10, ""Code"": ""EB430"", 
    ""CostCenter"": ""XYZ"" }"; // assume this is coming from database.

    var result = httpClient.PostAsJsonAsync("/jobs/isrunning", 
                                            jobArguments).Result;
    return Convert.ToBoolean(result);
}

我删除了不必要的代码和错误处理以简化此示例。

执行此 api 调用时,IsJobRunning 方法接收空 jobArguments 参数。

我是初学者,所以不知道我做错了什么。感谢我能得到解决此问题的任何帮助。

更新:更正了 IsJobRunning 方法签名

如果内容已经JSON,只需从数据存储中原样发送即可

例如

static HttpClient httpClient = new HttpClient("appurl");
public async Task<bool> CheckIfJobIsRunning(){
    httpClient.DefaultRequestHeaders.Accept.Add(
       new MediaTypeWithQualityHeaderValue("application/json"));

    var jobArguments = //Assuming the JSON came from database

    var content = new StringContent( jobArguments, Encoding.UTF8, "application/json");

    var response = await httpClient.PostAsync("/jobs/isrunning", content);

    var result = await response.Content.ReadAsAsync<bool>();
    return result;
}

Web API 操作还应该使用 [FromBody] 属性来告诉服务器上的模型绑定器到哪里寻找数据来绑定参数

[HttpPost]
[Route("jobs/isrunning")]
public IHttpActionResult IsJobRunning([FromBody]JobArguments jobArguments) {
   // some logic

   return Ok(true);
}

引用Parameter Binding in ASP.NET Web API