![](/img/trans.png)
[英]C# : .Net : Code working on Console application . Same code is failing when running on WCF service
[英]Console code not working in service
此代码已在控制台应用程序中经过测试。 它将传真发送到Microsoft传真控制台,并将更新查询发送到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); }
}
}
}
}
鉴于您已经说过代码可以作为控制台应用程序运行,因此我们几乎无法告诉您(因此代码中可能没有任何内容导致其无法正常工作)。
我的直觉说这是一个权限问题,因为Windows服务以比普通用户更少权限的用户身份运行,调试并遇到所引发的任何异常情况都可以相对迅速地告诉您问题所在。
请参阅“ MSDN上的页面, 调试Windows服务或研究日志记录例外”; 目前您正在编写控制台,但由于它是一项服务而看不到。
关于您应该整理的几件事,已有一些评论,遵循该建议将是一个好主意,但不应与为什么未发送传真有关。 如前所述,也许重用您的连接,或将其包装在using
语句中,以确保不再需要它时将其丢弃。
从上面的代码中我无法确定传真服务器是不是以您的用户名运行的桌面应用程序。 无论哪种方式,默认情况下,您的Windows服务都将安装在“本地系统”帐户下,并且该帐户无权访问您的用户帐户,因此它无法访问仅为您的用户名安装的任何内容。 您可以尝试在Windows服务面板中更改服务设置,以便您的服务以您的用户名运行。 那会给你一个线索。
由于它在控制台应用程序中可以正常工作,因此您的代码可能没有任何问题。 这可能与服务依赖性有关。 什么是FaxCOMLib? 如果那是您的计算机中正在运行的另一个服务,那么您必须将其注册为对该服务的依赖项。
您可以按以下方式注册服务(在命令行中):
sc config "NameOfYourService" depend= DependentServiceName
在您的情况下,从属服务名称可能是传真服务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.