Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FaxComLib FaxJob队列状态始终为;待决“;_C#_Com_Status_Fax - Fatal编程技术网

C# FaxComLib FaxJob队列状态始终为;待决“;

C# FaxComLib FaxJob队列状态始终为;待决“;,c#,com,status,fax,C#,Com,Status,Fax,我能够通过COM库FaxComLib(添加引用->COM选项卡->faxcom 1.0类型库)发送传真,并且传真成功通过 我的问题是,虽然我可以发送传真,但似乎无法从传真队列中获得准确的状态。FaxJob对象的QueueStatus属性始终返回“挂起” 环境:Windows 2003 R2 Enterprise w/SP2——也在Windows 2008 R2上进行了尝试,并获得了相同的结果 以下是我的原型代码: public void GetFaxStatus(int queueNum

我能够通过COM库FaxComLib(添加引用->COM选项卡->faxcom 1.0类型库)发送传真,并且传真成功通过

我的问题是,虽然我可以发送传真,但似乎无法从传真队列中获得准确的状态。FaxJob对象的QueueStatus属性始终返回“挂起”

环境:Windows 2003 R2 Enterprise w/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();
    }
public void GetFaxStatus(int queueNum)
{
FaxServer FaxServer=新的FaxServer();
连接(“myfaxservername”);
bool-isInQueue=false;
FaxJobs FaxJobs=(FaxJobs)faxServer.GetJobs();

对于(int i=1;i所以,我想不出任何实质性的东西,但我已经取得了一些进展。如果在检查状态之前调用FaxJob.Refresh(),您会得到一个更好的结果。似乎在大多数情况下,您仍然会得到一个没有帮助的状态(“未知”),但至少它并不总是“待定” 如果传真失败,这也会返回“重试次数超过”状态,但我想,否则,“未知”是唯一可以获得的状态

下面是一些示例代码:

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

我发现,传真状态最可靠的方法是使用“Microsoft传真服务扩展COM类型”库。添加对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枚举值提供了更好的状态


每个扩展状态代码的详细状态信息都会被引用。

这无疑是您的传真服务提供商的问题。请与制造商联系以获得支持。我们使用的是本地传真调制解调器和内置的Windows传真服务。实际上没有太多可配置的设置,我不确定应该选择哪个制造商rn to。这里没有第三方参与。你的
for loop
演示了如何枚举多个FaxJobs节省了我的时间!MSFT文档sux btw。
FaxJob
类提供的信息非常有限。我想获得传真提交时间、重试次数,有什么地方可以获得它吗?回答很好。谢谢你的帮助!