Я недавно добавил fop pdf-генератор в существующее приложение. все отлично работает локально, но когда я раскрываю жить на Azure я получаю следующие ошибки:org.apache.fop.apps.FOPException: .fop (Доступ запрещен) в Azure
org.apache.fop.apps.FOPException: .fop (Access is denied)
java.io.FileNotFoundException: .fop (Access is denied)
Я озадачен, почему я получаю сообщение об ошибке доступа к файлу, когда, казалось бы исключение происходит, когда fopfactory пишет в ByteOutputstream
функции, где улов происходит в
public static void GeneratePDF(string foFile, HttpContext context) {
StringBuilder sbDebug = new StringBuilder();
sbDebug.AppendLine("Start");
ByteArrayOutputStream os = new java.io.ByteArrayOutputStream();
try
{
sbDebug.AppendLine("Got to 1");
[email protected] s = new [email protected]();
sbDebug.AppendLine("Got to 2");
FopFactory fopFactory = FopFactory.newInstance(new java.io.File(System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/Test.xconf")));
sbDebug.AppendLine("Got to 3 - file ").AppendLine(System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/Test.xconf"));
Fop fop = fopFactory.newFop("application/pdf", os);
sbDebug.AppendLine("Got to 4");
javax.xml.transform.TransformerFactory factory = javax.xml.transform.TransformerFactory.newInstance();
javax.xml.transform.Transformer transformer = factory.newTransformer();
javax.xml.transform.Source src = new javax.xml.transform.stream.StreamSource(new java.io.StringReader(foFile));
javax.xml.transform.Result res = new javax.xml.transform.sax.SAXResult(fop.getDefaultHandler());
sbDebug.AppendLine("Got to 5");
transformer.transform(src, res);
context.Response.ContentType = "application/pdf";
context.Response.BinaryWrite(os.toByteArray());
//context.Response.BinaryWrite(System.Text.Encoding.UTF8.GetBytes(os.ToString()));
}
catch (Exception ex) {
throw new Exception(sbDebug.AppendLine(ex.ToString()).ToString());
}
finally {
os.close();
}
}
Вы можете увидеть, что я добавил некоторые отладочные строки, как мне пришлось прибегнуть к старомодной отладке, чтобы увидеть, что происходит. Выход из этого:
Catch Error: System.Exception: Start
Got to 1
Got to 2
Got to 3 - file
D:\home\site\wwwroot\App_Data\Test.xconf
org.apache.fop.apps.FOPException: .fop (Access is denied)
java.io.FileNotFoundException: .fop (Access is denied)
Так что я могу видеть исключение происходит на этой линии:
Fop fop = fopFactory.newFop("application/pdf", os);
Я ожидаю, что все происходит и в памяти, кроме чтения из xconf файл, где он должен быть.
Update 21/02/2017 Я теперь проверить, что файл xconf существует в нужном месте с помощью
string curFile = System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/Test.xconf");
if (System.IO.File.Exists(curFile)) //Used System.IO prefix as without it compiler complains of ambiguity with java.io
{
sbDebug.AppendLine("Got to 3a - file found");
}
else
{
sbDebug.AppendLine("Got to 3a - file NOT found");
}
А также, что он может быть считан с помощью
BufferedReader br = new BufferedReader(new FileReader(curFile));
sbDebug.AppendLine("Got to 3b");
String sJIObrOut = br.readLine();
sbDebug.AppendLine("Got to 3c");
while ((sJIObrOut = br.readLine()) != null)
{
sbDebug.Append("3d: ").AppendLine(sJIObrOut);
}
Этот предположим, что fopfactory пытается получить доступ к другому файлу, но я не могу понять, что.
Любая помощь с благодарностью получена.
UPDATE 2 22/3/17 Я не имел никакого успеха с услугами Azure Cloud так решили построить локальный веб-приложение, чтобы просто преобразовать xslfo документ в формате PDF и запустить его в качестве веб-службы. Это работает отлично локально, поэтому опубликована служба на сервере, который мы используем для других клиентов. Это не работает, и я получаю точно такую же ошибку, как и исходное сообщение. Это означает, что это не проблема Azure - есть ли у кого-нибудь другие идеи?
В моей Linux-системе .fop используется для хранения файлов кеша lik e font-cache. Он находится под '/ home/USER/.fop', где USER является пользователем tomcat. Поэтому я предполагаю, что FOP хочет создать этот файл где-нибудь под 'C: \ Users \ USER \ AppData \ Local' в Windows, что может быть запрещено с Azure. Я парень Linux, поэтому я не знаю точно, но, возможно, он помогает, тем не менее, – mondjunge