c# - 如何在 Web API Controller 中接收字节数组和 json

标签 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 是正确的方法吗?

最佳答案

该框架只能绑定(bind)正文中的一项,因此您尝试尝试的操作将无效。

相反,阅读您发送的请求内容并提取部分内容。

[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) 响应中的模型。

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

关于c# - 如何在 Web API Controller 中接收字节数组和 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43188759/

相关文章:

c# - 在 OpenXML 中处理 Word 文档时从 OpenXmlElement 获取 DocumentPart

c# - 存储复合/嵌套对象图

c# - ASP.NET MVC 4 + Ninject MVC 3 = 没有为此对象定义无参数构造函数

javascript - 如何使用 Typeahead.js 0.10 一步一步/远程/预取/本地

asp.net-mvc - 你怎么知道你的项目的WEB API版本?

c# - 无法多次将日期添加到循环中的日期

json - 戈朗 : Having trouble with nested JSON Unmarshaler

ruby-on-rails - 这个 Rails JSON 身份验证 API(使用 Devise)安全吗?

c# - 使用 OWIN 自托管 ASP.NET Web API 时,我应该如何存储每个请求数据

c# - Web API 2 中的 ExceptionFilter 与 ExceptionLogger 与 ExceptionHandler