0

此代码在控制台应用程序中进行了测试。它将向 microsoft Fax Console 发送传真并向 mysql 数据库发送更新查询。我已经将代码转移到服务应用程序。mysql 更新正在工作并将我的 mysql 表中的行更新为“DONE”,但传真没有发送到传真控制台。

有任何想法吗?

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); }
        }



    }
}

}

4

3 回答 3

1

鉴于您已经说过代码作为控制台应用程序工作,我们几乎不可能说出来(因此代码中可能没有任何内容导致它无法工作)。

我的直觉说这是一个权限问题,因为 Windows 服务以比普通用户权限更少的用户身份运行,调试并遇到任何引发的异常应该会相对快速地告诉您问题是什么。

请参阅 MSDN 上的页面,调试 Windows 服务或研究日志记录异常;目前你正在写信给控制台,你看不到它,因为它是一项服务。


对于您应该整理的一些事情有一些评论,遵循这些建议是一个好主意,但不应该与为什么不发送传真有关。如前所述,也许可以重用您的连接,或者将其包装在一个using语句中,以确保它在不再需要时立即被处理掉。

于 2011-12-14T22:05:11.233 回答
0

我无法从您上面的代码中判断传真服务器是否是以您的用户名运行的桌面应用程序。无论哪种方式,默认情况下,您的 Windows 服务将安装在本地系统帐户下,并且该帐户无权访问您的用户帐户,因此它无法访问仅为您的用户名安装的任何内容。您可以尝试更改 Windows 服务面板中的服务设置,以便您的服务以您的用户名运行。这会给你一个线索。

于 2011-12-14T22:06:08.523 回答
0

由于它在控制台应用程序中运行良好,因此您的代码可能没有任何问题。这可能与服务依赖关系有关。什么是 FaxCOMLib?如果这是在您的机器上运行的另一个服务,那么您必须将其注册为您的服务的依赖项。

您可以按如下方式注册服务(在命令行中):

sc config "NameOfYourService" depend= DependentServiceName

在您的情况下,从属服务名称可能是传真服务。

于 2011-12-14T22:18:26.107 回答