PostAsync работает с XML, но не с PDF-файлами - PullRequest
0 голосов
/ 07 ноября 2018

Я не могу понять, что не так и почему этот пост возвращает Error 500 только с файлами PDF, он нормально работает с файлами XML. Я попытался изменить значения заголовков во многих отношениях, он продолжает отвечать ту же ошибку:

Сервер обвинен:

MultipartException: Failed to parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly

Содержание:

public class UploadRequest
{
    public byte[] fileToUpload { get; set; }
    public string fileType { get; set; }
    public string fileReference { get; set; }
    public string issueDate { get; set; }
    public string userId { get; set; }
    public string headerValue { get; set; }

    public string fileName { get; set; }

    public UploadRequest(string fileName, byte[] fileToUpload, String fileType, String fileReference, 
        String issueDate, String userId, String headerValue)
    {
        this.fileName = fileName;
        this.fileToUpload = fileToUpload;
        this.fileType = fileType;
        this.fileReference = fileReference;
        this.issueDate = issueDate;
        this.userId = userId;
        this.headerValue = headerValue;
    }

    public MultipartFormDataContent getFormContent(){

      var fileToUploadContent = new ByteArrayContent(fileToUpload, 0, fileToUpload.Length);            
      fileToUploadContent.Headers.Add("content-type", "application/" + headerValue); // 'pdf' or 'xml'            

      return new MultipartFormDataContent
        {
            { fileToUploadContent, "file", fileName},
            { new StringContent(fileType), "fileType"},
            { new StringContent(fileReference), "fileReference"},
            { new StringContent(issueDate), "issueDate"},
            { new StringContent(userId), "userId"}
        };
    }
}

Почтовый метод:

public class Upload
{
   private HttpClient client = new HttpClient();
   private string urlBase = "https://xxxxxxxx-xx.xx.us10.hana.xxxxx.com/file/upload/ImportDeclaration/";

  public async void sendFilesWs(UploadRequest requestData, Int64 ?processNumber)
  {
    try
    {
      client.BaseAddress = new Uri(urlBase);
      client.DefaultRequestHeaders.Add("Authorization", "Apikey xxxx-d87a-xxxx-9a36-xxxx");
      client.DefaultRequestHeaders.Add("Origin", "https://xxxxxx.com");                

    } catch(Exception e)
    {
    // has  header
    }
    HttpResponseMessage response = await client.PostAsync(processNumber.ToString(), requestData.getFormContent());
    string contents = await response.Content.ReadAsStringAsync();
    //Console.Write(response.StatusCode);
  }
}

Звонок:

private void Form1_Load(object sender, EventArgs e)
{

  var pdfFile= System.IO.File.ReadAllBytes(this.Dir + "\\" + _fileName);

  var uploadRequest = new UploadRequest(_fileName, PdfFile, "Other",
                            number,
                            DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"),
                            "99999999", "pdf");

  Upload _Upload = new Upload();
  _Upload.sendFileWs(uploadRequest, _processNumber);
}

Заранее большое спасибо.

Обновление: Серверная часть была построена на Spring Boot 2

пружинный башмак 2 без фильтров:

@Override
@PostMapping("/{documentTag}/{documentId}")
public ResponseEntity<?> postFile(
    @RequestParam("file") MultipartFile file,
    @RequestParam("fileType") String fileType,
    @RequestParam("fileReference") String fileReference,
    @RequestParam("issueDate") String issueDate,
    @RequestParam("userId") String userId,
    @PathVariable(value = "documentTag") String documentTag,
    @PathVariable(value = "documentId") Long documentId) {

    logger.info("File received by File Service");

    FileInformation fileInformation = new FileInformation(FileType.of(fileType), fileReference, issueDate, userId);
    return fileUploadBusiness.upload(file, fileInformation, documentTag, documentId, request.getHeader("Authorization")
);

1 Ответ

0 голосов
/ 10 ноября 2018

Измените подпись вашего Form1_Load события на

private async void Form1_Load(object sender, EventArgs e)

За очень немногими исключениями события пользовательского интерфейса - единственный раз, когда вы должны видеть async void в своем коде. После этого измените подпись sendFilesWs() на

public async Task sendFilesWs(UploadRequest requestData, Int64 ?processNumber)

и затем в вашем Form1_Load событии вызовите это так:

await _Upload.sendFileWs(uploadRequest, _processNumber);

Как у вас было раньше:

  • событие срабатывает
  • звоните _Upload.sendFileWs()
  • возвращает управление вашему событию, как только его код достигнет await client.PostAsync()
  • код события продолжается, завершается, и _Upload выходит за рамки
  • В какой-то момент (именно тогда, когда вы не можете быть уверены, поэтому вы получаете непредсказуемые результаты), сборщик мусора очищает _Upload, включая содержащийся в нем HttpClient, который прервет все открытые соединения, и, следовательно, «Поток неожиданно завершился» на сервере.

С учетом вышеуказанных изменений событие теперь получает Task, которое оно может ожидать, поэтому _Upload теперь выходит из области действия только после завершения своей работы, предотвращая проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...