Консольный код не работает в сервисе - PullRequest
0 голосов
/ 15 декабря 2011

Этот код был протестирован в консольном приложении.Он отправит факс в Microsoft Fax Console и отправит запрос на обновление в базу данных 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); }
        }



    }
}

}

Ответы [ 3 ]

1 голос
/ 15 декабря 2011

Нам почти невозможно сказать, учитывая, что вы сказали, что код работает как консольное приложение (поэтому, вероятно, ничто в коде не заставляет его не работать).

Мой инстинкт говорит, что это проблема с правами, поскольку служба Windows запускается как пользователь с меньшими правами, чем у обычного пользователя, отладка и обнаружение любых возникших исключений должны сказать вам, в чем проблема относительно быстро.

См. Страницу в MSDN, Отладка службы Windows или исключения журналирования исследований; в данный момент вы пишете на консоль, которую вы не видите, поскольку это сервис.


Было несколько комментариев по поводу нескольких вещей, которые вы должны привести в порядок, и следование этому совету было бы хорошей идеей, но не должно быть связано с тем, почему факсы не отправляются. Как уже было сказано, возможно, повторно используйте ваше подключение или оберните его в оператор using, чтобы убедиться, что оно удаляется, как только оно больше не требуется.

0 голосов
/ 15 декабря 2011

Поскольку в консольном приложении все работает нормально, с вашим кодом не может быть никаких проблем.Это может быть что-то, связанное с сервисными зависимостями.Что такое FaxCOMLib?если на вашем компьютере запущена другая служба, вы должны зарегистрировать ее как зависимость от службы.

Вы можете зарегистрировать службу следующим образом (в командной строке):

sc config "NameOfYourService" depend= DependentServiceName

В вашемВ случае, если имя зависимой службы может быть службой факса.

0 голосов
/ 15 декабря 2011

Я не могу понять из вашего кода выше, является ли факс-сервер настольным приложением, которое работает под вашим именем пользователя или нет. В любом случае, ваша служба Windows будет установлена ​​под учетной записью локальной системы по умолчанию, и эта учетная запись не имеет доступа к вашей учетной записи пользователя, поэтому она не может получить доступ к чему-либо, что было установлено только для вашего имени пользователя. Вы можете попробовать изменить настройки службы на панели служб Windows, чтобы ваша служба работала под вашим именем пользователя. Это даст вам подсказку.

...