【问题标题】:How do I receive both json and binary data in a post to my webapi controller?如何在我的 webapi 控制器的帖子中接收 json 和二进制数据?
【发布时间】:2016-03-29 20:34:52
【问题描述】:

我创建了一个名为Event 的类。我的Event 类包含Documents 的列表。 Document 是我创建的另一个类。每个Document 类都包含一个名为DocumentData 的类,该类具有一个名为FileDatabyte[] 类型的属性。

所以它看起来像这样:

myEventObj.Documents[0].DocumentData.FileData

现在我的控制器接受新的或更新的Events 只接受 json 数据,这对我的 Event 类中的所有内容都很好,除了FileData

我有另一个接受文件上传的控制器。问题是,我没有简单的方法来链接我的第二个控制器接受的二进制文件数据并将其与发送到我的第一个控制器的EventFileData 属性配对。如何将它们组合起来,以便只调用一次我的网络服务来保存Event 以及任何文件数据?

这是我的事件控制器的 Post 和 Put 函数:

[HttpPost]
public IHttpActionResult Post(Event coreEvent) {
    coreEvent.PrepareToPersist();
    _unitOfWork.Events.Add(coreEvent);
    _unitOfWork.Complete();
    return Created("api/events/" + coreEvent.EventId, coreEvent);
}

[HttpPut]
public IHttpActionResult Put(Event coreEvent) {
    coreEvent.PrepareToPersist();
    _unitOfWork.Events.Update(coreEvent);
    _unitOfWork.Complete();
    return Ok(coreEvent);
}

这是处理文件上传的控制器的 Post 函数:

[HttpPost]
public async Task<IHttpActionResult> Post() {
    if (!Request.Content.IsMimeMultipartContent()) {
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
    }

    var provider = new MultipartMemoryStreamProvider();

    try {
        await Request.Content.ReadAsMultipartAsync(provider);

        foreach (var file in provider.Contents) {
            string filename = file.Headers.ContentDisposition.FileName.Trim('\"');
            byte[] buffer = await file.ReadAsByteArrayAsync();
        }
        return Ok();
    }
    catch (System.Exception e) {
        return InternalServerError(e);
    }
}

如何将这些放在一起?

【问题讨论】:

  • @Eminem 该链接发布的解决方案不起作用。 NameValueCollection 和 HttpFileCollection 对象不填充。
  • 你试过你的Event控制器了吗?它应该可以工作,因为 JSON 序列化程序会自动处理二进制数据。如果您想发送手工制作的请求,请确保在创建 JSON 请求数据时使用 base64 对二进制数据进行编码。你可以使用System.Convert.ToBase64String(bytes)

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


【解决方案1】:

通常我更喜欢它在两种方法中支持多 ajax 上传文件,所以第二种方法将支持通过 Ajax 上传文件,并在您将上传文件保存在服务器上的某个位置并添加后返回一个唯一密钥在数据库中记录它(例如:附件表),

当您调用第一个方法来发送事件时,您的对象 myEventObj.Documents[0].DocumentData.FileData 将包含从第二种方法返回的键,因此您的对象可能是 myEventObj.Documents 作为字符串列表(文件键)

谢谢

【讨论】:

    猜你喜欢
    • 2016-02-29
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 2011-07-08
    相关资源
    最近更新 更多