首页 新闻 会员 周边 捐助

window服务调用wcf服务

0
悬赏园豆:10 [已解决问题] 解决于 2015-04-20 16:45

以下是代码:

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应用程序下运行也是没问题的,请兄弟们赐教。。。。。。。。。。

勇哥哥的主页 勇哥哥 | 菜鸟二级 | 园豆:206
提问于:2015-04-09 13:46
< >
分享
最佳答案
0

1、Windows 服务里可以调用 WCF 服务。

2、你的调用中有个 catch,请把具体的异常信息记录下;

收获园豆:5
Launcher | 高人七级 |园豆:45050 | 2015-04-09 14:02

在catch里将异常信息记录到文本文件吗?但是在catch里好像也写不进去哦

勇哥哥 | 园豆:206 (菜鸟二级) | 2015-04-09 15:11

@勇哥哥: 

在catch里将异常信息记录到文本文件吗? -〉 是的。

但是在catch里好像也写不进去哦 -> 你做过测试了吗?是 catch 代码没执行,还是写文件失败?

Launcher | 园豆:45050 (高人七级) | 2015-04-09 15:16

@Launcher:

测试过了确定没有产生文本文件,关键是在windows服务里也不好调试.......也不清楚是 catch 代码没执行,还是写文件失败

勇哥哥 | 园豆:206 (菜鸟二级) | 2015-04-09 15:30

@勇哥哥: 

1、可以 Attach 到 Windows 服务进程;

2、你的代码有 BUG,应该这样:

try

{

  AccessServiceClient myClient = new AccessServiceClient();   //SvcUtil.exe生成的客户端代理类
            string ss = myClient.QueryMachineDq("");
}

catch(Exception e)

{

File.WriteAll(e.Message);
}

Launcher | 园豆:45050 (高人七级) | 2015-04-09 15:36

@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服务时就报这样的错,这是啥状况??

勇哥哥 | 园豆:206 (菜鸟二级) | 2015-04-09 17:01

@勇哥哥: 你这是两个问题了。

 

protected override void OnStart(string[] args)
        {

try

{
            //服务开始执行代码
            StartDoSomething();

} catch(Exception e){......// 写日志}
        }

Launcher | 园豆:45050 (高人七级) | 2015-04-09 17:09

@Launcher: 

"在 ServiceModel 客户端配置部分中,找不到引用协定“IAccessService”的默认终结点元素。这可能是因为未找到应用程序的配置文件,或者是因为客户端元素中找不到与此协定匹配的终结点元素。"这个是报的异常,可能是没有找到配置文件,但是在windows服务里调试时就没问题的,为什么正式运行的时候找不到配置文件呢?如果是缺少,那这个配置文件要放哪

勇哥哥 | 园豆:206 (菜鸟二级) | 2015-04-09 17:48

@勇哥哥: 你可以看下 App.Config 是不是在你的程序的目录下。

Launcher | 园豆:45050 (高人七级) | 2015-04-09 17:55

@Launcher: App.Config在程序目录下,在windows服务里调试都没问题的,就是在正式启动服务的时候报这样的错

勇哥哥 | 园豆:206 (菜鸟二级) | 2015-04-10 08:36

@Launcher: 

搞定了,要将配置写在代码里,因为windows服务在正式运行的时候就是读取的一个可执行文件,是没有配置文件的,所以报错了!

勇哥哥 | 园豆:206 (菜鸟二级) | 2015-04-10 14:29
其他回答(1)
0

一、我感觉这句:

fs = new FileStream("d:/1.txt", FileMode.OpenOrCreate);

似乎应该是“d:\\1.txt”

二、你可以调试一下看究竟是哪里报的错:

http://www.cnblogs.com/downmoon/archive/2009/09/16/1567643.html

收获园豆:5
邀月 | 园豆:25475 (高人七级) | 2015-04-11 13:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册