C# 从Web API向HttpClient发布JsonObject

C# 从Web API向HttpClient发布JsonObject,c#,asp.net,wcf,asp.net-web-api,wcf-web-api,C#,Asp.net,Wcf,Asp.net Web Api,Wcf Web Api,我正试图使用Web API中的HttpClient发布一个JsonObject。我不太确定该如何进行,在示例代码中也找不到太多 以下是我目前掌握的情况: var myObject = (dynamic)new JsonObject(); myObject.Data = "some data"; myObject.Data2 = "some more data"; HttpClient httpClient = new HttpClient("myurl"); httpClient.Defaul

我正试图使用Web API中的
HttpClient
发布一个
JsonObject
。我不太确定该如何进行,在示例代码中也找不到太多

以下是我目前掌握的情况:

var myObject = (dynamic)new JsonObject();
myObject.Data = "some data";
myObject.Data2 = "some more data";

HttpClient httpClient = new HttpClient("myurl");
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

HttpResponseMessage response = httpClient.Post("", ???);

我想我需要将我的
JsonObject
转换为
StreamContent
,但我在这一步上遇到了麻烦

最简单的方法是使用带有JSON对象JSON表示的
StringContent

httpClient.Post(
    "",
    new StringContent(
        myObject.ToString(),
        Encoding.UTF8,
        "application/json"));

根据.NET版本的不同,您还可以使用
HttpClientExtensions.postsjsonasync
方法


有了新版本的
HttpClient
,没有
WebApi
包,它将是:

var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
var result = client.PostAsync(url, content).Result;
或者,如果您想要它
异步

var result = await client.PostAsync(url, content);

如果使用Newtonsoft.Json:

using Newtonsoft.Json;
using System.Net.Http;
using System.Text;

public static class Extensions
{
    public static StringContent AsJson(this object o)
        => new StringContent(JsonConvert.SerializeObject(o), Encoding.UTF8, "application/json");
}
例如:

var httpClient = new HttpClient();
var url = "https://www.duolingo.com/2016-04-13/login?fields=";
var data = new { identifier = "username", password = "password" };
var result = await httpClient.PostAsync(url, data.AsJson())

我没有足够的声誉来评论pomber的答案,所以我发布了另一个答案。使用pomber的方法,我不断收到一个来自API的“400错误请求”响应,我将JSON请求发布到该API(Visual Studio 2017,.NET 4.6.2)。最终,问题被追溯到StringContent()生成的“Content Type”头不正确(请参阅)

tl;博士

使用pomber的答案加上一行,以正确设置请求的标题:

var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var result = client.PostAsync(url, content).Result;

vbnet中的代码:

dim FeToSend as new (object--> define class)

Dim client As New HttpClient
Dim content = New StringContent(FeToSend.ToString(), Encoding.UTF8,"application/json")
content.Headers.ContentType = New MediaTypeHeaderValue( "application/json" )
Dim risp = client.PostAsync(Chiamata, content).Result

msgbox(risp.tostring)

希望这些帮助

谢谢你的帮助

var result = client.PostAsync(url, content).Result;
我曾经

var result = await client.PostAsync(url, content);


因为结果使应用程序锁定高请求

请注意内容类型。我忽略了它,让我调试的时间比我希望的要长得多。但是你不应该处理StringContent实例吗?现在可以在Microsoft.AspNet.Client.WebApi nugetI中找到。我刚刚从Microsoft.AspNet.WebApi.Client安装了它。这解决了我的问题。在传递一个C#类时,我花了(很长时间)胡闹,该类包含一些属性,这些属性是使用client.PostAsync、client.SendAsync.列出的。。我得到的结果好坏参半。如果数组为空,我的API解决方案将拾取它,但如果数组中有一个项,则控制器方法无法对JSON进行建模绑定。谢谢你。。在我看来,PostAsJsonAsync更可靠地将复杂的C#对象转换为JSON。是否有nuget包?我讨厌当我把项目转移到一台新机器上时,这个参考资料总是不见。找这个还是别的什么?这不是asp.net核心特有的,它实际上是通用的,甚至4.5.6
JsonConvert.SerializeObject
问题使用DateTimes ISO 8601种类:本地或UTC。。。重载的StringContent构造函数帮了我一把。在异步方法上调用Result之前,请三思。不过,对于任何试图像我一样使用
将其放入
中的人来说:我在
StringContent
创建的周围放置了一个
using
。使用这个答案,我一直收到一个“400个错误的请求”来自我将JSON请求发布到的API的响应(Visual Studio 2017,.NET 4.6.2)。除了
var content=new-StringContent(jsonObject.ToString(),Encoding.UTF8,“application/json”)
之外,我还必须设置
content.Headers.ContentType=new-MediaTypeHeaderValue(“application/json”)。有关更多详细信息,请参阅下面的答案。谢谢您,anthls。var content=new StringContent(jsonObject.ToString(),Encoding.UTF8,“application/json”)不够。它需要content.Headers.ContentType=newMediaTypeHeaderValue(“应用程序/json”);谢谢你救了我的命,这很有效。为什么需要设置两次“application/json”,一次在构造函数中,一次通过属性?这是一只虫子吗?@FestusMartingale:问得好!从我对github问题的阅读(答案中有链接)来看,在
StringContent
构造函数中传递
“application/json”
可能不是必需的,因为它是在生成的
content.Headers.ContentType
属性上显式设置的。但是,我还没有在代码中对此进行测试。看起来服务器不支持完整内容类型字符串。当您在不重写ContentType的情况下使用构造函数时,它将值设置为
application/json;charset=utf-8
。这是因为第一个示例是阻塞调用,第二个示例是继续。