В моем последнем проекте NetCore (2.0) я использую Rotativa.AspNetCore, все работало нормально (локально), так как я опубликовал его в SmarterAsp.
Основная проблема заключается в том, что при попытке создать PDFФайл через мой API, действие не работает, возвращает ошибку:
Запрошенная страница не найдена.[404]
Ошибка синтаксического анализа XML: корневой элемент не найден
Расположение: https: //.../api/file/MembershipRegistrationApplication
Строка № 1, столбец 1:
Изображение ошибки:
https://i.stack.imgur.com/J5WAg.jpg
Вот мой код
[HttpPost]
[AllowAnonymous]
[Route("/api/file/MembershipRegistrationApplication")]
public async Task<byte[]> MembershipRegistrationApplication([FromBody] RegisterViewModel model)
{
var education = new List<Education>();
education.Add(_educationService.IncludeEducation(model.Education));
var user = new ApplicationUser
{
Email = model.Email,
PhoneNumber = model.PhoneNumber,
BirthDate = model.BirthDate,
Address = model.Address,
PlaceOfBirth = model.PlaceOfBirth,
MunicipalityOfBirthId = model.MunicipalityId,
IsMale = model.IsMale,
FathersName = model.FathersName,
LastName = model.LastName,
MaritalStatusId = model.MaritalStatusId,
CitizenshipId = model.CitizenshipId,
MunicipalityId = model.MunicipalityId,
FirstName = model.FirstName,
NationalityId = model.NationalityId,
PersonalNumber = model.PersonalNumber,
ForeignMunicipalityOfBirth = model.ForeignMunicipalityOfBirth,
Educations = education,
MaidenName = model.MaidenName
};
user = _accountService.IncludeApplicationUser(user);
return await _pdfGenerator.GenerateMembershipApplication(user);
}
GenerateMembershipApplication код метода
public async Task<byte[]> GenerateMembershipApplication(ApplicationUser user)
{
var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider };
var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
var bytePDF = new Rotativa.AspNetCore.ViewAsPdf("File/MembershipApplication", user)
{
PageMargins = { Top = 10, Right = 1, Bottom = 1, Left = 20 },
FileName = string.Concat("MembershipApplication", ".pdf")
}.BuildFile(actionContext);
return await bytePDF;
}
и вызов ajax
$.ajax({
url: "/api/file/MembershipRegistrationApplication",
type: 'post',
contentType: "application/json; charset=utf-8",
dataType: "json",
data: JSON.stringify(model),
success: function (data) {
var pdfAsDataUri = "data:application/pdf;base64,"+data;
window.open(pdfAsDataUri);
},
error: function (jqXHR, exception) {
var msg = '';
if (jqXHR.status === 0) {
msg = 'Not connect.\n Verify Network.';
} else if (jqXHR.status == 404) {
msg = 'Requested page not found. [404]';
} else if (jqXHR.status == 500) {
msg = 'Internal Server Error [500].';
} else if (exception === 'parsererror') {
msg = 'Requested JSON parse failed.';
} else if (exception === 'timeout') {
msg = 'Time out error.';
} else if (exception === 'abort') {
msg = 'Ajax request aborted.';
} else {
msg = 'Uncaught Error.\n' + jqXHR.responseText;
}
console.log(msg);
}
});
Сначала я подумал, что проблема связана с данными, публикуемыми вызовом ajax (Я пробовал также с formData, но все еще с той же ошибкой) и после многих часов попыток выяснить, что происходит, я обнаружил, что причиной ошибки был Rotativa. Еще одна причина, по которой я считаю, что Rotativa является причиной проблемы, заключается в том, что другие API, которые неотносятся к процессу создания PDF-файлов.
В моей папке Rotativa также есть необходимые файлы,
- help-wkhtmltoimage.txt
- help-wkhtmltopdf.txt
- msvcp120.dll
- msvcp140.dll
- msvcr120.dll
- vcruntime140.dll
- wkhtmltoimage.exe
- wkhtmltopdf.exe wkhtmltox.dll
Есть ли у кого-нибудь какие-либо идеи или предложения, что мне следует сделать, чтобырешить эту проблему?