web-dev-qa-db-ja.com

WebクライアントからのWebApiFromBodyがnull

こんにちは私はWebAPIコントローラーのbody変数が常にnullであるため、C#クライアントからWebApiメソッドを呼び出したいと思います。正しく設定するには?クライアント側:

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;
    }
}
9
Arbejdsglæde

それはあなたが技術的に文字列を渡していないという事実ともっと関係があると思います。匿名型のJSONシリアル化された文字列表現を渡しているため、WebApiの逆シリアル化プロセスが機能していません。リクエストがコントローラーとそのメソッドに到達するまでに、それは文字列ではなくなります。 SavImageメソッドのタイプを動的に変更してみてください。このような:

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

      return "-OK-" + version;
}

残念ながら、その時点では、インテリセンスを使用してプロパティを取得することはできません。ディクショナリを介して動的型からデータを取得する必要があります。

Dictionary<string, object> obj = JsonConvert.DeserializeObject<Dictionary<string, object>>(Convert.ToString(data));

もちろん、他のオプションは、クライアントとサーバー間で共有される実際のタイプを使用することです。それはこれを少し簡単にするでしょう。

21
jensendp

本文に渡される文字列値には、おそらく接頭辞=記号を付ける必要があります。

1
Dmitry S.