WCFを使用してリモートで呼び出し可能な単一のメソッドを使用して単純なWindowsサービスを作成し、コンソールアプリケーションからそのメソッドを呼び出すことがいかに難しいかについて、私はますます困惑しています。
Windowsサービスの作成とインストールについては理解できますが、コンソールアプリケーションがWindowsサービスと通信できるようにする方法が見つかりません。
私の目標は次のとおりです。
- インストールされているマシンに関係なく、Windowsサービスが単一のメソッドを公開するWCFサービスを自己ホストできるようにします。
- ユーザーが名前を入力したマシンでコンソールアプリケーションがそのメソッドを呼び出せるようにする必要があります。
- IISの存在を要求したくない。
- クリーンでシンプルな短いソリューションが必要です。1ページのコード以下のボーナスポイント。
- 厄介な過剰設計された構成ファイルはありません。
必要に応じて構成ファイルを持たないという目標は忘れることができると思いますが、他の目標についてはかなり決心しています。
長くて複雑なMSDNの記事や本を紹介する以外に、サービスを公開して利用するためのサンプルコードはありますか?あなたの援助は大歓迎です。最終的にはWCFを完全に読み上げることを約束します。必要なのはキックスタートだけです。
興味深い点として:WCFサービスを定義するときにインターフェイスが必要ですか?WCFサンプルコードでサービスインターフェイスが非常に優れているのはなぜですか?
よろしくお願いします。
ニック
みんなのおかげで、私は次の解決策をまとめることができました!
次のインフラストラクチャは、構成ファイルを必要とせずに、Windowsサービス内のWCFを介してCommsクラスを公開します。メタデータ発行が有効になっているため、関連するコンソールアプリケーションテスターにサービス参照を追加できます。
namespace AgentService
{
using System;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceProcess;
[ServiceContract]
public class Comms
{
[OperationContract]
public string GetStatus() { return "Running"; }
}
public class SelfHost<T>
{
private ServiceHost host = null;
public void Start()
{
var baseAddress = new Uri("http://localhost:8080/AgentService/");
host = new ServiceHost(typeof(T), baseAddress);
var behaviour = new ServiceMetadataBehavior() { HttpGetEnabled = true };
host.Description.Behaviors.Add(behaviour);
host.Open();
}
public void Stop() { host.Close(); }
}
public static class Program
{
public static void Main(string[] args)
{
if (args.Length > 0)
{
var host = new SelfHost<Comms>();
host.Start();
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
host.Stop();
}
else
{
var servicesToRun = new ServiceBase[] { new AgentService() };
ServiceBase.Run(servicesToRun);
}
}
}
}
次のクラスは、テスターコンソールアプリケーション全体で構成されています。繰り返しますが、構成ファイルは必要ありません。
namespace Tester
{
using System;
using System.ServiceModel;
using Tester.Comms;
public class Program
{
public static void Main(string[] args)
{
var comms = new CommsClient(new BasicHttpBinding(),
new EndpointAddress("http://localhost:8080/AgentService/"));
Console.WriteLine(comms.GetStatus());
Console.ReadKey();
}
}
}
すべての助けをありがとう。