FaxComLib Состояние очереди FaxJob всегда "Ожидание" - PullRequest
1 голос
/ 23 июня 2011

Я могу отправить факс через библиотеку COM FaxComLib (Добавить ссылку -> вкладка COM -> Библиотека типов faxcom 1.0), и факс успешно проходит.

Моя проблема в том, что, хотя я могу отправить факс, я не могу получить точный статус из очереди факсов. Свойство QueueStatus объекта FaxJob всегда возвращает «Ожидание».

Среда: Windows 2003 R2 Enterprise с пакетом обновления 2 (SP2) - также пробовал на Windows 2008 R2 с такими же результатами

Вот мой код прототипа:

    public void GetFaxStatus(int queueNum)
    {
        FaxServer faxServer = new FaxServer();
        faxServer.Connect("myfaxservername");
        bool isInQueue = false;

        FaxJobs faxJobs = (FaxJobs)faxServer.GetJobs();

        for (int i = 1; i <= faxJobs.Count; i++)
        {
            FaxJob j = (FaxJob)faxJobs.Item[i];
            MessageBox.Show(faxJobs.Item[i].GetType().ToString() + "\r\n" + CreateStatus(j));

            if (j.JobId == queueNum)
            {
                MessageBox.Show("Found Job:\r\n" + CreateStatus(j));
                isInQueue = true;
            }

        }

        if (isInQueue == false)
        {
            MessageBox.Show("Fax is no longer in queue.(...or does not exist)");
        }

        faxServer.Disconnect();
    }

    static string CreateStatus(FaxJob job)
    {
        StringBuilder sb = new StringBuilder();

        sb.AppendLine(string.Format("Billing Code: {0}", job.BillingCode));
        sb.AppendLine(string.Format("Device Status: {0}\r\n", job.DeviceStatus));
        sb.AppendLine(string.Format("Queue Status: {0}", job.QueueStatus));
        sb.AppendLine(string.Format("Display Name: {0}", job.DisplayName));
        sb.AppendLine(string.Format("Fax Number: {0}", job.FaxNumber));
        sb.AppendLine(string.Format("Job Id: {0}", job.JobId));
        sb.AppendLine(string.Format("Tsid: {0}", job.Tsid));
        sb.AppendLine(string.Format("Type: {0}", job.Type));
        sb.AppendLine(string.Format("Page Count: {0}", job.PageCount));

        return sb.ToString();
    }

Когда я запускаю его для задания, которое не удалось (превышен предел повторных попыток), я получаю следующее:

This result is always returned, no matter what the true status of the job is.

Это единственный статус, который я когда-либо получал для любой факсимильной работы; в любом статусе. Я делаю что-то неправильно? Я неправильно настроил факс-сервер? Можете ли вы пролить свет на мою проблему для меня?

Спасибо. * 1017 Джейсон *

Ответы [ 2 ]

2 голосов
/ 02 февраля 2012

Что мне показалось наиболее надежным для статуса факса, так это использование библиотеки «Расширенный тип COM службы факсов Microsoft». После добавления ссылки на библиотеку COM вы можете прослушивать события состояния, которые подробно описывают, что происходит с факс-сервером.

Я написал класс FaxServerListener, который регистрирует события, которые важно слушать, и одно из событий включает в себя объект FaxJobStatus, который содержит соответствующие свойства статуса.

Вот что вы делаете, чтобы зарегистрироваться на событие OnOutgoingJobChanged и затем прослушать его.

// ...
using FAXCOMEXLib;

public class FaxServerListener
{
    private FaxServer faxServer;

    public FaxServerListener(string faxServerMachineName)
    {
        faxServer = new FaxServer();
        faxServer.Connect(faxServerMachineName);
        RegisterFaxServerEvents();
    }

    private void RegisterFaxServerEvents()
    {
        // subscribe to multiple FaxServer events here ...
        faxServer.OnOutgoingJobChanged += faxServer_OnOutgoingJobChanged;

        /* very important, you MUST tell the FaxServer object which events you're
         * listening for, otherwise the events will never raise!
         * This is what I have set and you should only need one of the event types
         * to listen for but I didn't research this for your problem
         */
        var events = FAX_SERVER_EVENTS_TYPE_ENUM.fsetACTIVITY |
                     FAX_SERVER_EVENTS_TYPE_ENUM.fsetDEVICE_STATUS |
                     FAX_SERVER_EVENTS_TYPE_ENUM.fsetOUT_ARCHIVE |
                     FAX_SERVER_EVENTS_TYPE_ENUM.fsetOUT_QUEUE;

        faxServer.ListenToServerEvents(events);
    }

    private void faxServer_OnOutgoingJobChanged(FaxServer faxServer, string jobId,
        FaxJobStatus jobStatus)
    {
        // Of course you can do whatever you wish here. This is the method that
        // subscribes to the event with a JobStatus object
        string output = string.Format("Outgoing Job Changed -> {0}{1}{2}",
            jobId, Environment.NewLine, GetJobStatusOutput(jobStatus));

        // you could process the FaxJobStatus object how ever you wish here
        // I raised another event from this listener class with the output data
        // for other client code to listen to.
    }

    private string GetJobStatusOutput(FaxJobStatus jobStatus)
    {
        StringBuilder sb = new StringBuilder();

        sb.AppendLine("\tDeviceID: " + jobStatus.DeviceId.ToString());
        sb.AppendLine("\tCurrent Page: " + jobStatus.CurrentPage.ToString());
        sb.AppendLine("\tExt. Status Code: " + jobStatus.ExtendedStatusCode.ToString());
        sb.AppendLine("\tExt. Status: " + jobStatus.ExtendedStatus);
        sb.AppendLine("\tJob Type: " + jobStatus.JobType.ToString());
        sb.AppendLine("\tRetries: " + jobStatus.Retries.ToString());
        sb.AppendLine("\tSize: " + jobStatus.Size.ToString());
        sb.AppendLine("\tStatus: " + jobStatus.Status.ToString());
        sb.AppendLine("\tStart: " + jobStatus.TransmissionStart.ToShortTimeString());

        if (jobStatus.ExtendedStatusCode != FAX_JOB_EXTENDED_STATUS_ENUM.fjesTRANSMITTING)
        {
            sb.AppendLine("\tStop: " + jobStatus.TransmissionEnd.ToShortTimeString());
        }

        sb.AppendLine("\tTSID: " + jobStatus.TSID);

        return sb.ToString();
    }

}

Это пример выходных данных для этого кода

Outgoing Job Changed -> 201cce11ee0903f
    DeviceID: 65538
    Current Page: 1
    Ext. Status Code: fjesCALL_COMPLETED
    Ext. Status: 
    Job Type: fjtSEND
    Retries: 0
    Size: 10841
    Status: fjsINPROGRESS
    Start: 3:20 PM
    Stop: 3:21 PM
    TSID: Fax

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

Ссылка на подробную информацию о статусе каждого расширенного кода статуса здесь .

0 голосов
/ 21 июля 2011

Итак, я не смог придумать ничего существенного, но я добился небольшого прогресса. Если вы позвоните в FaxJob.Refresh () до проверки состояния, вы получите немного лучший результат. Похоже, что в большинстве случаев вы по-прежнему получаете бесполезный статус («Неизвестно» в моем случае), но по крайней мере это не всегда «Ожидание». Это также возвращает статус «Retries Exceeded» в случае сбоя факса, но в противном случае, я думаю, «Unknown» - это единственный статус, который вы можете получить.

Вот пример кода:

        if (j.JobId == queueNum)
        {
            MessageBox.Show("Found Job:\r\n" + CreateStatus(j));
            j.Refresh();
            isInQueue = true;
        }
...