В настоящее время я настраиваю сервер 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);