此代码在控制台应用程序中进行了测试。它将向微软传真控制台发送传真,并向mysql数据库发送更新查询。我已经将代码转移到一个服务应用程序中。mysql更新工作和更新行在我的mysql表为"完成",但传真没有被发送到传真控制台。
任何想法?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Timers;
using MySql.Data.MySqlClient;
using FAXCOMLib;
using FAXCOMEXLib;
namespace ProcessFaxes
{
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
public static Timer timer = new Timer();
protected override void OnStart(string[] args)
{
timer.Elapsed += new ElapsedEventHandler(Tick);
timer.Interval = 5000; // every 5 seconds
timer.Enabled = true;
//Console.ReadLine();
}
protected override void OnStop()
{
}
public static void Tick(object source, ElapsedEventArgs e)
{
string connString = "Server=localhost;Port=3306;Database=communications;Uid=myuser;password=mypass;";
MySqlConnection conn = new MySqlConnection(connString);
MySqlCommand command = conn.CreateCommand();
MySqlConnection connupdate = new MySqlConnection(connString);
MySqlCommand commandupdate = connupdate.CreateCommand();
command.CommandText = "SELECT * FROM outbox WHERE `faxstat` = 'Y' AND `fax` <> '' AND `faxpro` = 'PENDING'";
//command.CommandText = "UPDATE blah blah";
//conn.Open();
//conn.ExecuteNonQuery();
//conn.Close();
try
{
conn.Open();
connupdate.Open();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
MySqlDataReader reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
Console.WriteLine(reader["filepath"].ToString());
SendFax(reader["id"].ToString(), reader["filepath"].ToString(), @"C:FAXDOC" + reader["filepath"].ToString(), reader["account"].ToString(), reader["fax"].ToString());
string id = reader["id"].ToString();
commandupdate.CommandText = "UPDATE outbox SET `faxpro` = 'DONE' WHERE `id` = '" + id + "'";
commandupdate.ExecuteNonQuery();
}
}
conn.Close();
connupdate.Close();
}
public static void SendFax(string DocumentId, string DocumentName, string FileName, string RecipientName, string FaxNumber)
{
if (FaxNumber != "")
{
try
{
FAXCOMLib.FaxServer faxServer = new FAXCOMLib.FaxServerClass();
faxServer.Connect(Environment.MachineName);
FAXCOMLib.FaxDoc faxDoc = (FAXCOMLib.FaxDoc)faxServer.CreateDocument(FileName);
faxDoc.RecipientName = RecipientName;
faxDoc.FaxNumber = FaxNumber;
faxDoc.BillingCode = DocumentId;
int Response = faxDoc.Send();
faxServer.Disconnect();
}
catch (Exception Ex) { Console.WriteLine(Ex.Message); }
}
}
}
}
如果你说代码是作为控制台应用程序工作的,我们几乎不可能告诉你(所以可能代码中没有任何东西导致它不工作)。
我的直觉告诉我这是一个权利问题,因为windows服务是以一个比普通用户权限更少的用户运行的,调试和遇到任何异常应该能相对较快地告诉你问题是什么。
查看MSDN页面,调试Windows服务或研究日志异常;现在你正在写控制台,你看不到它,因为它是一个服务。
有一些关于你应该整理的事情的评论,遵循这些建议将是一个好主意,但不应该与为什么不发送传真有关。如前所述,可以重用您的连接,或者将其包装在using
语句中,以确保在不再需要时立即处理它。
从上面的代码中我无法判断传真服务器是否是以您的用户名运行的桌面应用程序。无论哪种方式,你的Windows服务将默认安装在本地系统帐户下,该帐户无法访问你的用户帐户,因此它无法访问仅为你的用户名安装的任何内容。您可以尝试更改Windows服务面板中的服务设置,以便您的服务以您的用户名运行。这会给你一个提示。
由于它在主机应用程序中运行良好,因此您的代码可能没有任何问题。这可能与服务依赖关系有关。什么是facxcomlib ?如果你的机器上运行的是另一个服务,那么你必须将它注册为你的服务的依赖项。
你可以注册一个服务,如下所示(在命令行中):
sc config "NameOfYourService" depend= DependentServiceName
在您的示例中,从属服务名称可能是Fax service。