使用动态对象调用Web Api 2和HttpClient

3

我现在正在开发一个基于.NET Framework 4.7.2的应用程序。我需要在我的C#代码中调用Web API Controller。

我正在更新一个动态对象,我不能创建任何视图模型。动态对象具有以下结构,并将动态填充不同的键:

List<KeyValuePair<int,Dictionary<string, object>>>

调用代码如下:

var task = Task.Run(async () => await UpdateMyInformation(myDynamicObject));
var test = task.Result;

方法实现:
private async Task<dynamic> UpdateMyInformation(dynamic data)
{
    var content = new StringContent(JsonConvert.SerializeObject(data).ToString(), 
        Encoding.UTF8, "application/json");
    var baseUrl = "http://localhost:1234/api/MyInformationController";

    using (HttpClient client = new HttpClient())
    {
        var response = await client.PutAsync(baseUrl, content);
        response.EnsureSuccessStatusCode();
        var result = response.Content.ReadAsStringAsync().Result;
        return result;
    }

}

API控制器的样子如下所示:
public class MyInformationController : ApiController
{
    [HttpPut]
    public async Task<dynamic> Put(dynamic myData)
    {
       // I need to parse data and return the new dynamic object
       // Manipulate myData according to a given logic

        return myData;
    }
}

我可以在控制器中接收数据,我的问题是:我应该使用动态方式将JSON对象传递到我的控制器中吗?

也许更好的解决方法是什么?


1
在您的Web API控制器中,最好使用JObject而不是使用dynamic,因为JObject允许您比dynamic更轻松地操作JSON。 - er-sho
我认为控制器操作应该返回IActionResult而不是对象。 - daremachine
1
避免使用.Result阻塞异步操作,尽管两者无关。 - Crowcoder
不相关,但不要在长时间运行的任务中使用Task.Run。这会阻塞线程池线程。相反,请使用Task.Factory.StartNew(...)选项TaskCreationOptions.LongRunning - Tobias Moe Thorstensen
谢谢大家,提供了很好的输入! - timhorton42
1个回答

1
我会使用 JObject 代替 dynamic。
public class MyInformationController : ApiController
{
    [HttpPut]
    public async Task<dynamic> Put(JObject myData)
    {
       // I need to parse data and return the new dynamic object
       // Manipulate myData according to a given logic

        return myData;
    }
}

通过使用JObject,您可以根据键访问对象中的属性。有关更多信息,请参见文档

1
谢谢,我仍然在努力解决我的复杂结构的序列化问题...但我想这是正确的方法 :) - timhorton42
很高兴能帮助@timhorton42。祝你好运! - Tobias Moe Thorstensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接