2016-09-08 2 views
6

Angular2 프론트 엔드, ASP.NET 코어 웹 API 공용 백엔드 및 ASP.NET 코어 웹으로 구성된 웹 응용 프로그램을 빌드하고 있습니다 api 개인용 백엔드.ASP.NET 코어 웹 API에서 다른 ASP.NET 코어 웹 API로 파일 게시

Angular2에서 공개 백엔드로 파일 업로드가 작동합니다. 그러나 우리는 이들을 사설 백엔드에 게시하는 것을 선호합니다.

현재 작업 코드

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

거기에서 내가 file.CopyTo (FILESTREAM)을 사용하여 파일을 디스크에 저장할 수 있습니다;

그러나이 파일이나 파일을 다시 보내거나 이상적으로 전체 요청을 내 두 번째 웹 API 코어에 보내려고합니다.

asp.net 코어의 HttpClient 클래스를 사용하여이를 달성하는 방법을 잘 모르겠습니다.

나는 그런

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

으로 모든 종류의 것들을 시도했습니다하지만 내 두 번째 백엔드 빈 IFormFile을 가져옵니다.

파일을 스트림으로 보내고 다른 쪽에서 파일을 재구성 할 수는 있지만 작동시킬 수는 없다고 느낍니다.

솔루션은 두 개의 웹 API 코어를 사용해야합니다.

답변

7

솔루션

공공 백엔드

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

개인용 백엔드 API를 호출 할 때 HttpClient를 무시하면 공용 Core API 프로젝트에서 개인용 Core API 프로젝트를 참조하고 Core API 프로젝트에서 컨트롤러를 직접 호출 할 수 있습니까? 요청이 여전히 null이거나 비어 있음을 확인하십시오. 요청에 값이있는 경우 문제는 HttpClient를 사용하는 것입니다.

이상적으로는 소비 클라이언트에 배포하려는 비공개 Core API 용 패키지 라이브러리 (SDK 종류)를 만들고 싶습니다. 이것은 랩퍼/프록시와 같은 역할을합니다. 이렇게하면 개인용 백엔드 시스템을 격리 할 수 ​​있고 별도로 문제를 해결할 수 있습니다. 따라서 공개 코어 API 프로젝트 (개인용 백엔드 클라이언트)는이를 Nuget 패키지로 참조 할 수 있습니다. DMZ에서

1

안녕하세요 저도 같은 문제를 가지고 이것은 나를 위해 일한 것입니다 :

내 설정이다 netCore MVC netCoreApi.

[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를 방법 :

내 MVC 컨트롤러처럼 보이는

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

그리고 적어도 내 WebApi 컨트롤러 :

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

여기에 전체 코드를 보려면 내 위해 RESTClient 게시물입니다 방법 :

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; 
     } 
    } 

// 그래 난 HttpStatusCode.Created 다시받지 메신저 알고

행복 코딩))