Mat*_*nks 16 c# windows-services fax interfax
我之前看到过这个问题,但我没有看到任何明确的答案,绝对没有任何答案可以解决我的问题.我创建了一个Windows服务,使用FAXCOMEXLib livrary发送传真(半自动).到目前为止,我的服务已成功发送文本文件(.txt).但是当我尝试发送pdf,jpg或tif文件时,我收到"操作失败"错误.在SO中,我已经看到很多关于运行该服务的用户的权限的讨论.我尝试了很多不同的选项(本地服务,本地用户,具有管理员权限的自定义用户,允许服务与桌面交互).但似乎没有任何区别.似乎该服务没有权限打开相应的应用程序来"打印"pdf,jpg或tif文件.但我只是在猜测.有没有人成功通过FAXCOMEXLib在Windows服务中发送传真?这是我发送传真的代码:
fileName = @"D:\temp\FaxTest.txt"; //THIS WORKS
//fileName = @"D:\temp\FaxTest.pdf"; //Operation failed
//fileName = @"D:\temp\FaxTest.tif"; //Operation failed
faxDoc.Sender.Name = faxRec.From;
faxDoc.Sender.Company = faxRec.From;
faxDoc.Body = fileName;
faxDoc.Subject = faxRec.ReferenceId;
faxDoc.DocumentName = faxRec.ReferenceId;
var to = "xxxxxxxxxx";
faxDoc.Recipients.Add(to, "Some Name");
var serverName = Environment.MachineName;
string[] returnVal = faxDoc.Submit(serverName);
Run Code Online (Sandbox Code Playgroud)
如果您想知道,是的,那些文件确实存在于具有这些名称的服务器上,并且它们是有效文件(我可以在Adobe Reader和Picture Viewer中打开它们).如果我在我的开发机器上本地运行它,这也可以正常工作.当然,在发送之前(在我的本地机器上)弹出适当的查看器.我的猜测是,由于某种原因,该服务无法打开查看器.有没有人成功地在Windows服务中以这种方式发送PDF?
我想对此给出一个完整的答案。之前发布的答案提供了一些解决方案,但它们并未全面介绍我们在自定义 Windows 服务中使用 FAXCOMEXLib 通过传真线路成功发送 pdf 文件所需执行的所有操作。
我想首先说 FAXCOMEXLib 是为 Windows 控制台应用程序而不是 Windows 服务而设计的。您甚至可以在文档中阅读这一点。我认为这就是为什么我们在让它发挥作用时遇到如此大的困难。
然而,经过多次尝试和错误,我们(最终)能够让它发挥作用。我们遇到的大多数问题都与 Adobe Reader 中的设置和权限有关。我们发现 Adobe Reader 在处理 PDF 文件时试图在幕后做很多事情。它试图做的那些“事情”需要用户交互(点击警报框等)。在 Windows 服务下运行此程序时,该服务没有用户交互,这导致我们的进程无限期挂起并最终出错。但是,我们发现有一种方法可以解决这一切。我们是这样做的:
这是我们正在使用的有效代码片段:
fileName = @"D:\temp\FaxTest.pdf";
faxDoc.Sender.Name = faxRec.From;
faxDoc.Sender.Company = faxRec.From;
faxDoc.Body = fileName;
faxDoc.Subject = faxRec.ReferenceId;
faxDoc.DocumentName = faxRec.ReferenceId;
var to = "xxxxxxxxxx";
faxDoc.Recipients.Add(to, "Some Name");
var serverName = Environment.MachineName;
var myProcesses = Process.GetProcessesByName("AcroRd32");
foreach (var myProcess in myProcesses)
{
if (DateTime.Now.Ticks - myProcess.StartTime.Ticks > TimeSpan.FromSeconds(30).Ticks) {
myProcess.Kill();
}
}
string[] returnVal = faxDoc.Submit(serverName);
Run Code Online (Sandbox Code Playgroud)
当然,我们的服务中还有比这更多的代码。其他代码执行诸如处理回调事件处理程序以跟踪发送/完成/失败传真的状态等操作。但这是实际启动“发送”的代码的“核心”。
以下是我们对服务器所做的配置更改列表,以使我们的自定义 Windows 服务正确解码、渲染并将 pdf 文件作为传真发送。其中一些已在某些答案中列出,但有些则没有,我希望这是一个完整的答案。
myProcess.Kill()示例代码的函数中看到我们是如何做到这一点的)。那应该可以了。这有点麻烦,但我希望这提供了一个完整的示例,说明如何将 Adobe Reader 与自定义 Windows 服务结合使用,以从 Windows 服务器上的 pdf 文件发送传真。我们已经这样做了几个月了,没有任何问题。我们的客户处理的传真量很少,因此我无法说明这如何处理大量的传真。因此,如果您正在寻找一种“免费”发送传真的方式,而无需支付 Interfax 之类的费用,那么这可能是一个可行的选择,至少对于低容量而言。
| 归档时间: |
|
| 查看次数: |
757 次 |
| 最近记录: |