Отправить файл от NodeJS до C# WCF - PullRequest
0 голосов
/ 19 марта 2020

В настоящее время я настраиваю сервер nodejs, но на этом сервере необходимо создать отчет с помощью jsreport, сохранить его локально, а затем отправить его в другой наш сервис, которым является WCF.

В WCF получите Stream и сохраните файл в нашем каталоге по умолчанию.

Тестирование запроса на бессонницу, чтобы отправить файл, работает отлично. Но через Узел, используя Ax ios или Request, происходит связь, но сгенерированный файл имеет размер 1 КБ.

Вот выдержка из вызова NodeJS.

Чтобы сделать запрос, Я использую модуль Request, v ^ 2.88.2. (Но я тоже пробовал с Ax ios)

const formData2 = { 
                            file: fs.createReadStream(reportFile) //the file path
                        }

                        request.post({
                            url: urlSend,//Url of post
                            headers: {
                                'Content-Type': 'multipart/form-data' 
                            },
                            formData: formData2,
                        }, function(error, response, body) {
                            console.log(response);
                        });

Внутри .pdf файла есть что-то вроде

----------- ----------------- 209853603972788926274398 Content-Disposition: form-data; Name = "файл"; filename = "APR-RST-06-REV-00.pdf" Тип содержимого: application / pdf

% PDF-1.4% ׃כיב 1 0 obj <<p> Мой C# код, в котором находится файл отправлено (я внес некоторые изменения, чтобы удалить другие коды):

public string uploadFileReport(string arg1, string arg2, string arg3, string arg4, string arg5, Stream file)
        { 

            try
            {  
                if (string.IsNullOrEmpty(arg1) || string.IsNullOrEmpty(arg2) || string.IsNullOrEmpty(arg3))
                    throw new Exception("Um ou mais parâmetros não foram encontrados");

                string diretorioData = "C:\\DATA\\"; 

                //Nome do arquivo.
                string fileName = (string.IsNullOrEmpty(arg5) ? "relatório.pdf" : arg5); 
                string directoryPath = diretorioData + "CRM\\"; 

                if (!Directory.Exists(directoryPath))
                {
                    Directory.CreateDirectory(directoryPath);
                }


                 int length = 0;
                 using (FileStream writer = new FileStream(directoryPath + "\\"+fileName, FileMode.Create))
                 {
                     int readCount;
                     var buffer = new byte[8192];
                     while ((readCount = file.Read(buffer, 0, buffer.Length)) != 0)
                     {
                         writer.Write(buffer, 0, readCount);
                         length += readCount;
                     }
                 }

                return JsonConvert.SerializeObject(new
                {
                    status = "OK", 
                }, Formatting.Indented);
            }
            catch (Exception exc)
            {
                return JsonConvert.SerializeObject(new
                {
                    status = "NOK",
                    message = exc.Message
                }, Formatting.Indented);
            }

        }

По какой-то причине для этого метода потребовался UriTemplate в файле интерфейса. Но, чтобы работать на узле, мне нужно было отправить эти значения в качестве параметра url. Возможно, в этом причина, но, как я уже сказал, от бессонницы этот метод работает отлично.

  [WebInvoke(Method = "POST",
           BodyStyle = WebMessageBodyStyle.WrappedRequest,
           RequestFormat = WebMessageFormat.Json,
           ResponseFormat = WebMessageFormat.Json,
           UriTemplate = "/uploadFileReport?arg1={arg1}&arg2={arg2}&arg3={arg3}&arg4={arg4}&arg5={arg5}")]
        [OperationContract]
        string uploadFileReport(string arg1, string arg2, string arg3, string arg4, string arg5, Stream file);

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Для тех, кто может столкнуться с этой же проблемой, вот как я могу ее решить. Я изменил свой request.post на что-то вроде:

 const options2 = {
                                method: "POST",
                                url: urlSend,
                                headers: {
                                    "Authorization": "Bearer " + token, 
                                    "Content-Type": "application/octet-stream", 
                                },
                                encoding: 'binary',
                                multipart: [ 
                                    {  
                                        body: fs.createReadStream(reportFile) 
                                    }
                                ],
                            };  

request(options2, function (err, res, body) {
});

И в моем WCF web.config я добавил привязку, поэтому принимайте большие файлы:

 <binding name="UploadBinding"
                transferMode="Streamed"
              maxBufferPoolSize="2000000000"
              maxBufferSize="2000000000"
                receiveTimeout="01:00:00"
                sendTimeout="01:00:00"
                maxReceivedMessageSize="2000000000" >

          <readerQuotas maxDepth="2000000000"
               maxStringContentLength="2000000000"
               maxArrayLength="2000000000"
               maxBytesPerRead="2000000000"
               maxNameTableCharCount="2000000000" />
        </binding>

И наконец, добавил эту привязку к сервису

      <service name="WCFService.CRMH0001">
        <endpoint behaviorConfiguration="AspNetAjaxBehavior" binding="webHttpBinding" bindingConfiguration="UploadBinding"
         contract="WCFService.ICRMH0001" />
      </service>
0 голосов
/ 20 марта 2020

WCF не поддерживает Formdata по умолчанию, его можно правильно обработать с помощью сторонней библиотеки,
https://archive.codeplex.com/?p=multipartparser
Кроме того, с включением потока в WCF подпись функции не может содержать более одного аргумента.
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-enable-streaming
Можете ли вы получить доступ к странице описания услуги должным образом? Я не думаю, что служба может работать нормально, хотя вы сказали, что можете заставить ее работать отлично.
Пожалуйста, обратитесь к этой ссылке для решения проблемы загрузки файлов.
Как загрузить изображение различного типа ( jpg / png / gif) на сервер через Stream с помощью веб-API WCF
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

...