将文件从ASP.NET Core web api发布到另一个ASP.NET Core web api

我们正在构建一个Web应用程序,它包含一个Angular2前端,一个ASP.NET Core web api公共后端和一个ASP.NET Core web api私有后端。

将文件从Angular2上传到公共后端可以正常工作。 但我们更愿意将它们发布到私有后端。

当前的工作代码

[HttpPost] public StatusCodeResult Post(IFormFile file) { ... } 

从那里我可以使用file.CopyTo(fileStream)将文件保存到磁盘;

但是,我想重新发送该文件或那些文件,或者理想情况下,将整个请求重新发送到我的第二个web api核心。

我不知道如何使用asp.net核心的HttpClient类来实现这一点。

我尝试过各种各样的事情

 StreamContent ss = new StreamContent(HttpContext.Request.Body); var result = client.PostAsync("api/Values", ss).Result; 

但我的第二个后端得到一个空的IFormFile。

我有一种感觉,可以将文件作为流发送并在另一侧重建它们,但无法使其工作。

解决方案必须使用两个web api核心。

DMZ的公共后端

 [HttpPost] public StatusCodeResult Post(IFormFile file) { try { if (file != null && file.Length > 0) { using (var client = new HttpClient()) { try { client.BaseAddress = new Uri(currentPrivateBackendAddress); byte[] data; using (var br = new BinaryReader(file.OpenReadStream())) data = br.ReadBytes((int)file.OpenReadStream().Length); ByteArrayContent bytes = new ByteArrayContent(data); MultipartFormDataContent multiContent = new MultipartFormDataContent(); multiContent.Add(bytes, "file", file.FileName); var result = client.PostAsync("api/Values", multiContent).Result; return StatusCode((int)result.StatusCode); //201 Created the request has been fulfilled, resulting in the creation of a new resource. } catch (Exception) { return StatusCode(500); // 500 is generic server error } } } return StatusCode(400); // 400 is bad request } catch (Exception) { return StatusCode(500); // 500 is generic server error } } 

私人后端

 [HttpPost] public void Post() { //Stream bodyStream = HttpContext.Request.Body; if (Request.HasFormContentType) { var form = Request.Form; foreach (var formFile in form.Files) { var targetDirectory = Path.Combine(_appEnvironment.WebRootPath, "uploads"); var fileName = GetFileName(formFile); var savePath = Path.Combine(targetDirectory, fileName); using (var fileStream = new FileStream(savePath, FileMode.Create)) { formFile.CopyTo(fileStream); } } } } 

嗨我有同样的问题,这对我有用:

我的设置是netCore MVC netCoreApi。

我的MVC控制器看起来像:

 [HttpPost("UploadFiles")] public async Task Post(List files) { Sp4RestClient dataPovider = new Sp4RestClient("http://localhost:60077/"); long size = files.Sum(f => f.Length); foreach (var file in files) { await dataPovider.ImportFile(file); } return Ok(); } 

DataProvider方法:

 public async Task ImportFile(IFormFile file) { RestClient restClient = new RestClient(_queryBulder.BuildImportFileRequest()); using (var content = new MultipartFormDataContent()) { content.Add(new StreamContent(file.OpenReadStream()) { Headers = { ContentLength = file.Length, ContentType = new MediaTypeHeaderValue(file.ContentType) } }, "File", "FileImport"); var response = await restClient.Post(content); } } 

至少我的WebApi控制器:

 [HttpPost] [Route("ImportData")] public IActionResult Import(IFormFile file) { return Ok(); } 

要查看完整代码,请参阅我的RestClient Post方法:

 public async Task> Post(HttpContent content) { using (HttpClient httpClient = new HttpClient()) { HttpResponseMessage response = await httpClient.PostAsync(Endpoint, content); if (response.StatusCode == HttpStatusCode.Created) { T result = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); return new RestResult { Result = result, ResultCode = HttpStatusCode.OK }; } RestResult nonOkResult = new RestResult { Result = default(T), ResultCode = response.StatusCode, Message = await response.Content.ReadAsStringAsync() }; return nonOkResult; } } 

//是的,我知道我没有得到HttpStatusCode.Created;)

快乐的编码;)

在调用私有后端API时忽略HttpClient,是否可以从公共Core API项目引用私有Core API项目并直接从Core API项目调用控制器? 请参阅请求仍为空/空。 如果请求带有值,则问题在于使用HttpClient。

理想情况下,您希望为要分发给使用客户端的专用Core API创建一个包库(一种SDK)。 这就像一个包装器/代理。 这样您就可以隔离私有后端系统,您可以单独对其进行故障排除。 因此,您的公共Core API项目(它是私有后端客户端)可以将其作为nuget包引用。