Web客户端的Web Api FromBody为null
本文关键字:Web null FromBody Api 客户端 | 更新日期: 2023-09-27 17:58:51
你好,我想通过Web Api控制器中的主体变量一直为空来从C#客户端调用Web Api方法。如何设置正确?客户端:
IFileService imgService = new ImageServiceBll();
var image = System.Drawing.Image.FromFile(serverFile);
var dataImage = imgService.ImageToBase64(image, System.Drawing.Imaging.ImageFormat.Png);
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://site.local/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
// HTTP POST
var data = new
{
imageData = dataImage,
version = version
};
HttpResponseMessage response = await client.PostAsJsonAsync("api/contenttool/SaveImage", data);
if (response.IsSuccessStatusCode)
{
Uri gizmoUrl = response.Headers.Location;
}
}
服务器端:
public class ContentToolController : ApiController
{
public IFileService FileService { get; set; }
// POST api/contenttool
public string SaveImage([FromBody]string data)
{
JObject jObject = JObject.Parse(data);
JObject version = (JObject)jObject["version"];
return "-OK-" + version;
}
}
我认为这更多地与技术上没有传入字符串这一事实有关。您正在传入匿名类型的JSON序列化字符串表示,因此WebApi中的反序列化过程对您不利。当您的请求到达控制器和该方法时,它已经不是字符串了。尝试将SavImage方法上的类型更改为动态类型。像这样:
public string SavImage([FromBody]dynamic data)
{
JObject jObject = JObject.Parse(data);
JObject version = (JObject)jObject["version"];
return "-OK-" + version;
}
不幸的是,在这一点上,你将无法使用intellisense来获取你的属性。您必须通过字典从动态类型中获取数据。
Dictionary<string, object> obj = JsonConvert.DeserializeObject<Dictionary<string, object>>(Convert.ToString(data));
当然,您的另一个选择是使用客户端和服务器之间共享的实际类型。这会让事情变得容易一点。
正文中传递的字符串值可能需要以=
符号为前缀。