我有使用开发的简单 Web apiAsp.Net Core
我正在尝试使用 HttpClient 发布键值对。我尝试了两种方法。
第一种方法
[Route("api/[controller]/[action]")]
public class TransformationController : Controller
{
private IServiceResolver _serviceResolver;
public TransformationController(IServiceResolver serviceResolver)
{
_serviceResolver = serviceResolver;
}
[HttpPost]
[ActionName("Post1")]
public void Post1([FromBody]Dictionary<string, string> data)
{
// do something
}
}
然后我将其发布如下
[Fact]
public void TestPost1()
{
var content = new Dictionary<string, string>();
content.Add("firstname", "foo");
var httpContent = new FormUrlEncodedContent(content);
var client = new HttpClient();
var result = client.PostAsync("http://localhost:17232/api/Transformation/Post1", httpContent).GetAwaiter().GetResult();
}
但我越来越Unsupported Media Type
error
{StatusCode:415,ReasonPhrase:“不支持的媒体类型”,版本:
1.1,内容:System.Net.Http.StreamContent,标头:{ 日期:2016 年 8 月 29 日星期一 19:44:44 GMT 服务器:Kestrel X-SourceFiles:
=?UTF-8?B?QzpccmVwb3NcY3ItbWV0YXRhc2tlclxzcmNcSW5ib3VuZEludGVncmF0aW9uXFRyYW5zZm9ybWF0aW9ucy5BcGlcYXBpXFRyYW5zZm9ybWF0aW9uXFryYW5zZm9ybWF0aW9uMQ ==?=
X-Powered-By: ASP.NET 内容长度: 0 }}
方法2
由于我无法指定内容类型和编码FormUrlEncodedContent
我更改了 post 方法的签名,现在它以 Json 字符串作为参数。想法是将字符串反序列化为字典。
[HttpPost]
[ActionName("Post2")]
public void Post2([FromBody]string data)
{
var dictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(data);
// do something here
}
然后我发布如下字符串
[Fact]
public void TestPost2()
{
var httpContent = new StringContent("{ \"firstName\": \"foo\" }", Encoding.UTF8, "application/json");
var client = new HttpClient();
var result = client.PostAsync("http://localhost:17232/api/Transformation/Post2", httpContent).GetAwaiter().GetResult();
}
但是当我调试测试时;这data
Post2 方法中的参数为 null。
我不确定这两种方法都缺少什么?有人可以帮忙吗
Update1
如果我使用 POSTMAN 来发布数据,那么它就可以工作。因此,对于方法 1,我可以将原始数据发布为
{
"firstname": "foo"
}
Approach2 将原始数据发布为
"{\"firstname\": \"foo\"}"
然而,当我使用 HttpClient 时,相同的数据不起作用