0

そのため、クライアントがEnterキーを押すのを待ってから、ハードコードされた場所から別の場所にファイルをコピーするコンソールアプリケーションがありました。コンソールアプリケーションとして、これはうまく機能しますが、Windowsサービスに変換すると、クライアントがEnterキーを押すと、次のエラーコードが表示されます。

"Could not connect to http://localhost:8080/myService. TCP error code 10061: 
 No connection could be made because the target machine actively refused it 127.0.0.1:8080."

ポートが開いていることと、ファイアウォールがポートをブロックしていないことを確認しました。すべてがはっきりしているように見えるので、何が起こっているのか混乱しています。以下にクライアントとホストのコードを投稿します。それを見て、見逃したことがあるかどうかを知らせてください。これを進めることができます。

これはホストです

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceProcess;
using System.ServiceModel;
using myServiceLib;

namespace myServiceHost
{
    class Program : ServiceBase
    {
        static void Main(string[] args)
        {
            ServiceBase.Run(new Program());
        }

        public Program()
        {
             this.ServiceName = "myService";
        }

        protected override void OnStart(string[] args)
        {
            base.OnStart(args);

            using (ServiceHost serviceHost = new ServiceHost(typeof(myService)))
            {
                serviceHost.Open();
            }
        }
    }
}

これはクライアントです

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace myServiceClient
{
    class Program
    {
        static void Main(string[] args)

        Console.WriteLine("***** Prepairing to transfer files ***** \n");

        using (FileXferClient myMethod = new FileXferClient())
        {
            Console.WriteLine("Press any key to begin transfer...");
            Console.ReadLine();
            string fileName = "test.txt";
            string sourcePath = @"C:\TestFromC";
            string targetPath = @"C:\TestFromC\Test Folder";

            myMethod.FileXfer(fileName, sourcePath, targetPath);

            Console.WriteLine("File transfer is complete!");
        }
            Console.ReadLine();
        }
    }
}

myServiceLib(これはロジックを備えたライブラリにあります)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace myServiceLib
{
    public class myService : IFileXfer
    {
        public myService()
        {
            Console.WriteLine("Awaiting Files...");
        }
        public void FileXfer(string fileName, string sourcePath, string targetPath)
        {
            string passFileName = fileName;
            string passSourcePath = sourcePath;
            string passTargetPath = targetPath;

            string sourceFile = System.IO.Path.Combine(sourcePath, fileName);
            string destFile = System.IO.Path.Combine(targetPath, fileName);

            if (!System.IO.Directory.Exists(targetPath))
            {
                System.IO.Directory.CreateDirectory(targetPath);
            }

            System.IO.File.Copy(sourcePath, destFile, true);

            if (System.IO.Directory.Exists(sourcePath))
            {
                string[] files = System.IO.Directory.GetFiles(sourcePath);

                foreach (string s in files)
                {
                    fileName = System.IO.Path.GetFileName(s);
                    destFile = System.IO.Path.Combine(targetPath, fileName);
                    System.IO.File.Copy(s, destFile, true);
                }
            }
            else
            {
                Console.WriteLine("Source path does not exist!");
            }

            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace myServiceLib 
{
    [ServiceContract(Namespace = "http://Intertech.com")]
    public interface IFileXfer
    {
        //Transfer files from one the target machine to the destination location
        [OperationContract]
        void FileXfer(string fileName, string sourcePath, string targetPath);
    }
}
4

1 に答える 1

2

ServiceHost開始直後に閉じます:

    protected override void OnStart(string[] args)
    {
        base.OnStart(args);

        using (ServiceHost serviceHost = new ServiceHost(typeof(myService)))
        {
            serviceHost.Open();
        }
    }

これはステートメント内にあるため、メソッドが戻る前に破棄されますusing(呼び出しと同等)。CloseOnStart

代わりに、クラスにserviceHostフィールドを作成してから、次のようにします。Program

    protected override void OnStart(string[] args)
    {
        base.OnStart(args);

        serviceHost = new ServiceHost(typeof(myService));
        serviceHost.Open();
    }

    protected override void OnStop()
    {
        serviceHost.Close();

        base.OnStop();
    }
于 2012-05-04T14:49:40.327 に答える