簡體   English   中英

Web Api FromBody從Web客戶端為空

[英]Web Api FromBody is null from web client

您好我想通過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;
    }
}

服務器端:

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序列化字符串表示形式,因此Web Api中的反序列化過程對您不利。 當您的請求到達控制器和該方法時,它不再是字符串。 嘗試將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));

當然,您的另一個選擇是使用客戶端和服務器之間共享的實際類型。 這會讓這更容易一些。

在body中傳遞的字符串值可能需要以=符號為前綴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM