2016-09-08 56 views
6

Chúng tôi đang xây dựng một ứng dụng web bao gồm một lối vào Angular2, một trang web ASP.NET Core api công cộng, và một ASP.NET Core web api tin phụ trợ.Đăng các tệp từ ASP.NET Core web api lên một trang web ASP.NET Core khác api

Tải tệp từ Angular2 lên công trình phụ trợ công khai. Nhưng chúng tôi muốn đăng chúng lên phía trước tới phần phụ trợ riêng tư.

mã làm việc hiện tại

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

Từ đó tôi có thể lưu các tập tin vào đĩa sử dụng file.CopyTo (FileStream);

Tuy nhiên, tôi muốn gửi lại tệp đó hoặc các tệp đó hoặc lý tưởng là toàn bộ yêu cầu tới lõi api web thứ hai của tôi.

Tôi không chắc chắn làm thế nào để đạt được điều này với lớp HttpClient của lõi asp.net.

Tôi đã thử tất cả mọi thứ như

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

Nhưng phụ trợ thứ hai của tôi được một IFormFile trống.

Tôi có cảm giác có thể gửi (các) tệp dưới dạng luồng và tạo lại chúng ở phía bên kia, nhưng không thể làm cho tệp hoạt động.

Giải pháp phải sử dụng hai lõi api web.

Trả lời

7

Giải pháp

backend công trong 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 
    } 
} 

backend Private

[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); 
      }     
     } 
    }   
} 
0

Bỏ qua HttpClient khi bạn gọi API phụ trợ riêng tư, bạn có thể tham chiếu dự án API lõi riêng tư từ dự án API lõi công cộng và gọi bộ điều khiển trực tiếp từ dự án API lõi không? Xem yêu cầu vẫn còn null/trống. Nếu yêu cầu xuất hiện với một giá trị thì vấn đề là với việc sử dụng HttpClient.

Lý tưởng nhất là bạn muốn tạo thư viện gói (loại SDK) cho API lõi riêng của mình mà bạn muốn phân phối cho khách hàng tiêu thụ. Hành vi này giống như trình bao bọc/proxy. Bằng cách này, bạn có thể tách riêng hệ thống phụ trợ riêng tư và bạn có thể khắc phục sự cố này một cách riêng biệt. Vì vậy, bạn dự án Core API công cộng (là ứng dụng khách phụ trợ riêng tư) có thể tham chiếu nó như gói nuget.

1

Hi i có cùng một vấn đề và đây là những gì làm việc cho tôi:

thiết lập của tôi là netCore MVC netCoreApi.

Controller MVC của tôi trông giống như:

[HttpPost("UploadFiles")] 
public async Task<IActionResult> Post(List<IFormFile> 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 Phương pháp:

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<IFormFile>(content); 
     } 
    } 

Và điều khiển WebAPI tôi nhất:

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

Để xem mã hoàn chỉnh ở đây là RestClient bài viết của tôi phương pháp:

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

// Vâng tôi biết im không nhận được HttpStatusCode.Created trở lại;)

hạnh phúc mã hóa;)

Các vấn đề liên quan