Web Api FromBody从Web客户端为空

Arb*_*æde 9 c# asp.net-mvc-4 asp.net-web-api asp.net-mvc-5

您好我想通过Web api控制器中的body变量从C#客户端调用Web Api方法始终为null.如何设置正确?客户端:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

服务器端:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

jen*_*ndp 22

我认为这与你在技术上没有传入字符串这一事实有关.您传递的是匿名类型的JSON序列化字符串表示形式,因此Web Api中的反序列化过程对您不利.当您的请求到达控制器和该方法时,它不再是字符串.尝试将SavImage方法上的类型更改为动态.像这样:

public string SavImage([FromBody]dynamic data)
{
      JObject jObject = JObject.Parse(data);
      JObject version = (JObject)jObject["version"];

      return "-OK-" + version;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,您将无法使用intellisense来获取您的房产.您必须通过字典从动态类型中获取数据.

Dictionary<string, object> obj = JsonConvert.DeserializeObject<Dictionary<string, object>>(Convert.ToString(data));
Run Code Online (Sandbox Code Playgroud)

当然,您的另一个选择是使用客户端和服务器之间共享的实际类型.这会让这更容易一些.