2016-07-06 77 views
3

我有以下代码,基本上它需要一个动态对象(在这种情况下是类型文件)并使用HTTPClient类尝试POST到WebAPI controller,问题我得到的是控制器总是得到NULL为我的[FromBody]参数上的值。如何使用HttpClient将JSON数据发布到Web API

代码
var obj = new 
     { 
      f = new File 
      { 
       Description = description, 
       File64 = Convert.ToBase64String(fileContent), 
       FileName = fileName, 
       VersionName = versionName, 
       MimeType = mimeType 
      }, 
     } 

var client = new HttpClient(signingHandler) 
{ 
    BaseAddress = new Uri(baseURL + path) //In this case v1/document/checkin/12345 
}; 

client.DefaultRequestHeaders.Accept.Clear(); 
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));       

HttpResponseMessage response; 
action = Uri.EscapeUriString(action); 

//Obj is passed into this, currently it is of type File 
var content = new StringContent(JsonConvert.SerializeObject(obj).ToString(), 
      Encoding.UTF8, "application/json"); 

response = client.PostAsync(action, content)).Result; 
if (response.IsSuccessStatusCode) 
{  
    var responseContent = response.Content;     
    string responseString = responseContent.ReadAsStringAsync().Result; 
    return JsonConvert.DeserializeObject<T>(responseString); 
} 

控制器
[HttpPost] 
[Route("v1/document/checkin/{id:int}")] 
public void Checkin_V1(int id, [FromBody] File f) 
{ 
     //DO STUFF - f has null on all of its properties 
} 

模型
public class File 
{ 
    public string FileName { get; set; } 
    public string VersionName { get; set; } 
    public string Description { get; set; } 
    public string MimeType { get; set; } 
    public byte[] Bytes { get; set;} 
    public string File64 { get; set; } 
} 

该模型是在WebAPI和客户端应用程序两者共享。

任何帮助,为什么这是失败的,将不胜感激,一直在绕圈子一段时间了。

回答

7

您的obj在开始时不需要。这是将f嵌套在另一个对象内部。

var obj = new 
    { 
     f = new File 
     { 
      Description = description, 
      File64 = Convert.ToBase64String(fileContent), 
      FileName = fileName, 
      VersionName = versionName, 
      MimeType = mimeType 
     }, 
    } 

更改为

var f = new File 
{ 
    Description = description, 
    File64 = Convert.ToBase64String(fileContent), 
    FileName = fileName, 
    VersionName = versionName, 
    MimeType = mimeType 
}; 

然后,只需序列F。

+0

工程就像一个魅力,谢谢。 –

4

我觉得这是对你的代码

var obj = new 
    { 
     f = new File 
     { 
      Description = description, 
      File64 = Convert.ToBase64String(fileContent), 
      FileName = fileName, 
      VersionName = versionName, 
      MimeType = mimeType 
     }, 
    } 

由于此,这部分问题将被从你真正需要什么不同的序列化。 试试这个,而不是

var obj = new File 
     { 
      Description = description, 
      File64 = Convert.ToBase64String(fileContent), 
      FileName = fileName, 
      VersionName = versionName, 
      MimeType = mimeType 
     } 
相关问题