从HttpClient提交文件和Json数据到webapi

我想将文件和json数据从HttpClient发送到Web api服务器。

我似乎无法通过有效载荷访问服务器中的json,只能作为json变量。

 public class RegulationFilesController : BaseApiController

{

public void PostFile(RegulationFileDto dto)

{

//the dto is null here

}

}

这是客户:

   using (var client = new HttpClient())

{

using (var content = new MultipartFormDataContent())

{

client.BaseAddress = new Uri(ConfigurationManager.AppSettings["ApiHost"]);

content.Add(new StreamContent(File.OpenRead(@"C:\\Chair.png")), "Chair", "Chair.png");

var parameters = new RegulationFileDto

{

ExternalAccountId = "1234",

};

JavaScriptSerializer serializer = new JavaScriptSerializer();

content.Add(new StringContent(serializer.Serialize(parameters), Encoding.UTF8, "application/json"));

var resTask = client.PostAsync("api/RegulationFiles", content); //?ApiKey=24Option_key

resTask.Wait();

resTask.ContinueWith(async responseTask =>

{

var res = await responseTask.Result.Content.ReadAsStringAsync();

}

);

}

}

您能否建议在相同的请求下如何访问文件和提交的json和文件?

谢谢

回答:

我尝试了多种方法来提交文件数据和元数据,这是我发现的最佳方法:

不要使用MultipartFormDataContent,仅将StreamContent用于文件数据。这样,您就可以流式传输文件上传,因此您不会在服务器上占用过多的RAM。MultipartFormDataContent要求您将整个请求加载到内存中,然后将文件保存到某处的本地存储中。通过流传输,还具有将流复制到其他位置(例如Azure存储容器)的好处。

这解决了二进制数据以及元数据的问题。为此,请使用自定义标头并将您的JSON序列化为该标头。您的控制器可以读取自定义标头并将其反序列化为元数据dto,这是大量数据。如果需要更多空间,则可以执行两个单独的请求,一个请求发布最低需求,然后执行PATCH更新需要比头文件容纳更多的任何属性。

样例代码:

public class RegulationFilesController : BaseApiController

{

public async Task<IHttpActionResult> Post()

{

var isMultipart = this.Request.Content.IsMimeMultipartContent();

if (isMultipart)

{

return this.BadRequest("Only binary uploads are accepted.");

}

var headerDto = this.GetJsonDataHeader<RegulationFileDto>();

if(headerDto == null)

{

return this.BadRequest("Missing X-JsonData header.");

}

using (var stream = await this.Request.Content.ReadAsStreamAsync())

{

if (stream == null || stream.Length == 0)

{

return this.BadRequest("Invalid binary data.");

}

//save stream to disk or copy to another stream

var model = new RegulationFile(headerDto);

//save your model to the database

var dto = new RegulationFileDto(model);

var uri = new Uri("NEW URI HERE");

return this.Created(uri, dto);

}

}

private T GetJsonDataHeader<T>()

{

IEnumerable<string> headerCollection;

if (!this.Request.Headers.TryGetValues("X-JsonData", out headerCollection))

{

return default(T);

}

var headerItems = headerCollection.ToList();

if (headerItems.Count() != 1)

{

return default(T);

}

var meta = headerItems.FirstOrDefault();

return !string.IsNullOrWhiteSpace(meta) ? JsonConvert.DeserializeObject<T>(meta) : default(T);

}

}

以上是 从HttpClient提交文件和Json数据到webapi 的全部内容, 来源链接: utcz.com/qa/403156.html

回到顶部