以下是代码:
AccessServiceClient 就是生成的客户代理类,确定能正常访问服务. --------------------------------------------------------------------------------------- 以下是Windows服务里调用了Wcf客户端代理类的代码: protected override void OnStart(string[] args) { //服务开始执行代码 StartDoSomething(); } private void StartDoSomething() { System.Timers.Timer timer = new System.Timers.Timer(10000); //间隔10秒 timer.AutoReset = true; timer.Enabled = false; //执行一次 //timer.Elapsed += new ElapsedEventHandler(WriteSomething); timer.Elapsed += new System.Timers.ElapsedEventHandler(WriteSomething); timer.Start(); } private void WriteSomething(object source, System.Timers.ElapsedEventArgs e) { AccessServiceClient myClient = new AccessServiceClient(); //SvcUtil.exe生成的客户端代理类 string ss = myClient.QueryMachineDq(""); FileStream fs = null; try { string strJsonData = myClient.QueryMachineDq(""); fs = new FileStream("d:/1.txt", FileMode.OpenOrCreate); string strText = ss; //获得字节数组 byte[] data = new UTF8Encoding().GetBytes(strText); //开始写入 fs.Write(data, 0, data.Length); //清空缓冲区、关闭流 myClient.Close(); fs.Flush(); fs.Close(); fs.Dispose(); } catch { } finally { if (fs != null) { fs.Close(); fs.Dispose(); } myClient.Abort(); } } Windows服务也能正确安装,运行也没报错,但是就是不会产生1.txt文本文件,如果没有服务代理类是可以产生文本文件的,是不是Windows服务里不能调用Wcf服务呢?赐教了兄弟们..................
windows服务能正常运行,但是并没有产生1.txt这个文本文件,如果不调用wcf服务是能正常产生这个文本文件的,就肯定是wcf服务在windows服务里运行有问题了,但是这个wcf服务在windows应用程序下运行也是没问题的,请兄弟们赐教。。。。。。。。。。
1、Windows 服务里可以调用 WCF 服务。
2、你的调用中有个 catch,请把具体的异常信息记录下;
在catch里将异常信息记录到文本文件吗?但是在catch里好像也写不进去哦
@勇哥哥:
在catch里将异常信息记录到文本文件吗? -〉 是的。
但是在catch里好像也写不进去哦 -> 你做过测试了吗?是 catch 代码没执行,还是写文件失败?
@Launcher:
测试过了确定没有产生文本文件,关键是在windows服务里也不好调试.......也不清楚是 catch 代码没执行,还是写文件失败
@勇哥哥:
1、可以 Attach 到 Windows 服务进程;
2、你的代码有 BUG,应该这样:
try
{
AccessServiceClient myClient = new AccessServiceClient(); //SvcUtil.exe生成的客户端代理类
string ss = myClient.QueryMachineDq("");
}
catch(Exception e)
{
File.WriteAll(e.Message);
}
@Launcher:
我现在改了下代码,在windows服务里调试时wcf服务可以运行并且能获取到数据,但是在启动服务时就报错,以下是代码及截图:
public Service1() { InitializeComponent(); } protected override void OnStart(string[] args) { //服务开始执行代码 StartDoSomething(); } //public void OnStart() //{ // //服务开始执行代码 // StartDoSomething(); //} protected override void OnStop() { //服务结束执行代码 } protected override void OnPause() { //服务暂停执行代码 base.OnPause(); } protected override void OnContinue() { //服务恢复执行代码 base.OnContinue(); } protected override void OnShutdown() { //系统既将关闭执行代码 base.OnShutdown(); } private void StartDoSomething() { //System.Timers.Timer timer = new System.Timers.Timer(10000); //间隔10秒 //timer.AutoReset = true; //timer.Enabled = false; //执行一次 ////timer.Elapsed += new ElapsedEventHandler(WriteSomething); //timer.Elapsed += new System.Timers.ElapsedEventHandler(WriteSomething); //timer.Start(); WriteSomething(); //WriteSomething(object source, System.Timers.ElapsedEventArgs e) } private void WriteSomething() { AccessServiceClient myClient = new AccessServiceClient(); //SvcUtil.exe生成的客户端代理类 FileStream fs = null; try { string ss = myClient.QueryMachineDq(""); fs = new FileStream("e:/DoorExpiryDateMail.txt", FileMode.OpenOrCreate); string strText = ss; //获得字节数组 byte[] data = new UTF8Encoding().GetBytes(strText); //开始写入 fs.Write(data, 0, data.Length); //清空缓冲区、关闭流 fs.Flush(); fs.Close(); fs.Dispose(); } catch(Exception ex) { } finally { if (fs != null) { fs.Close(); fs.Dispose(); } //myConn.Close(); //myConn.Dispose(); //myClient.Abort(); } }
启动windows服务时就报这样的错,这是啥状况??
@勇哥哥: 你这是两个问题了。
protected override void OnStart(string[] args)
{
try
{
//服务开始执行代码
StartDoSomething();
} catch(Exception e){......// 写日志}
}
@Launcher:
"在 ServiceModel 客户端配置部分中,找不到引用协定“IAccessService”的默认终结点元素。这可能是因为未找到应用程序的配置文件,或者是因为客户端元素中找不到与此协定匹配的终结点元素。"这个是报的异常,可能是没有找到配置文件,但是在windows服务里调试时就没问题的,为什么正式运行的时候找不到配置文件呢?如果是缺少,那这个配置文件要放哪
@勇哥哥: 你可以看下 App.Config 是不是在你的程序的目录下。
@Launcher: App.Config在程序目录下,在windows服务里调试都没问题的,就是在正式启动服务的时候报这样的错
@Launcher:
搞定了,要将配置写在代码里,因为windows服务在正式运行的时候就是读取的一个可执行文件,是没有配置文件的,所以报错了!
一、我感觉这句:
fs = new FileStream("d:/1.txt", FileMode.OpenOrCreate);
似乎应该是“d:\\1.txt”
二、你可以调试一下看究竟是哪里报的错:
http://www.cnblogs.com/downmoon/archive/2009/09/16/1567643.html