如何在Web API控制器中接收字节数组和json

时间:2017-04-03 15:37:21

标签: c# json asp.net-web-api

我需要在c#Web API应用程序中接收一个json对象和一个字节数组。

这就是我发送数据的方式:

public bool SendMedia(string method, Media media)
{
    string filePath = Path.GetFullPath(Path.Combine(filesDirectory, media.FileName));
    if (!File.Exists(filePath))
    {
        return false;
    }
    using (var client = new HttpClient())
    using (var content = new MultipartContent() )
    {
        content.Add(new StringContent(JsonConvert.SerializeObject(media), Encoding.UTF8, "application/json"));
        byte[] b = File.ReadAllBytes(filePath);
        content.Add(new ByteArrayContent(b, 0, b.Length));
        var response = client.PostAsync(new Uri(baseUri, method).ToString(), content).Result;
        if (response.IsSuccessStatusCode)
            return true;
        return false;
    }
}

这就是我试图接收它的方式:

// POST: api/Media
[ResponseType(typeof(Media))]
public HttpResponseMessage PostMedia(Media media, byte[] data)
{
    int i = data.Length;
    HttpResponseMessage response = new HttpResponseMessage();
    if (!ModelState.IsValid)
    {
        response.StatusCode = HttpStatusCode.ExpectationFailed;
        return response;
    }

    if (MediaExists(media.MediaId))
        WebApplication1Context.db.Media.Remove(WebApplication1Context.db.Media.Where(p => p.MediaId == media.MediaId).ToArray()[0]);
    WebApplication1Context.db.Media.Add(media);


    try
    {
        WebApplication1Context.db.SaveChanges();
    }
    catch (DbUpdateException)
    {
        response.StatusCode = HttpStatusCode.InternalServerError;
        return response;
        throw;
    }

    response.StatusCode = HttpStatusCode.OK;
    return response;
}

我目前对网络开发的了解不多。发送MultipartContent正确的方法吗?

1 个答案:

答案 0 :(得分:3)

框架只能绑定一个来自正文的项目,所以你试图尝试的东西不起作用。

相反,请在发送请求内容时读取请求内容并提取部分。

[ResponseType(typeof(Media))]
public async Task<IHttpActionResult> PostMedia() {

    if (!Request.Content.IsMimeMultipartContent()) { 
        return StatusCode(HttpStatusCode.UnsupportedMediaType); } 

    var filesReadToProvider = await Request.Content.ReadAsMultipartAsync(); 

    var media = await filesReadToProvider.Contents[0].ReadAsAsync<Media>(); 
    var data = await filesReadToProvider.Contents[1].ReadAsByteArrayAsync();

    int i = data.Length;

    if (!ModelState.IsValid) {
        return StatusCode(HttpStatusCode.ExpectationFailed);
    }

    if (MediaExists(media.MediaId))
        WebApplication1Context.db.Media.Remove(WebApplication1Context.db.Media.Where(p => p.MediaId == media.MediaId).ToArray()[0]);
    WebApplication1Context.db.Media.Add(media);


    try {
        WebApplication1Context.db.SaveChanges();
    } catch (DbUpdateException) {
        return StatusCode(HttpStatusCode.InternalServerError);
    }

    return Ok(media);
}

另请注意,在原始代码中,您声明操作具有[ResponseType(typeof(Media))],但从未返回该类型的对象。上述答案包括Ok(media)响应中的模型。

这是一个非常简单的例子。根据需要添加任何验证。