0

.net を使用して遠隔地からリモート制御または影響を受ける必要がある Windows フォーム アプリケーションがあるとします。

私がグーグルで調べた限りでは、そのアプリケーション内で WCF サービスをホストすることが最善の方法です。アプリケーションに WCF サービスを正常に追加し、次のコマンドで開始できます

    ServiceHost host = new ServiceHost(typeof(Service1));   
    host.Open();

実行中のアプリケーションの残りの部分からクラスへの参照を取得するには、どのような方法がよいでしょうか?
次の2つの方法しかないと思います。

  • 静的プロパティを使用して他のメソッドを呼び出したり、サービス メソッド内からプロパティを設定したりします。
  • サービス クラスへの参照を割り当てますか? (サービス ホスト内でホストされているサービスに値を割り当てるにはどうすればよいですか?)

過去にどのような方法が有効でしたか?

コメントに基づいて更新します
。次のようなものを探していると思います。

    ServiceHost host = new ServiceHost(typeof(Service1));   
    host.Open();  
    (Service1)host.MyProperty = "asd";

ServiceHost (またはそのプロパティ) を Service1 のインスタンスにキャストする方法が見つからないようです。それはおそらく私の問題をすべて解決するでしょう;)

4

2 に答える 2

4

コメントに基づいて追加したことを実際に行うことはできません。

ServiceHost host = new ServiceHost(typeof(Service1));
host.Open();
(Service1)host.MyProperty = "asd";

その時点では、クラスのインスタンスはService1まだ作成されていないためです。また、サービスに対する新しいリクエストが到着したときにのみ作成されます。

1つの代替方法は、カスタムインスタンスプロバイダー(以下のコードに表示)を使用することです。このプロバイダーでは、WCFランタイムで使用される前にサービスインスタンスへの参照があります。インスタンスプロバイダーの詳細については、http://blogs.msdn.com/b/carlosfigueira/archive/2011/05/31/wcf-extensibility-iinstanceprovider.aspxを参照してください。

public class StackOverflow_10932251
{
    [ServiceContract]
    public interface ITest
    {
        [OperationContract]
        string Echo(string text);
    }
    public class Service : ITest
    {
        public string MyProperty { get; set; }
        public string Echo(string text)
        {
            Console.WriteLine("Inside Service.Echo, MyProperty = {0}", this.MyProperty);
            return text;
        }
    }
    static Binding GetBinding()
    {
        var result = new WSHttpBinding(SecurityMode.None);
        return result;
    }
    public class MyInstanceProvider : IEndpointBehavior, IInstanceProvider
    {
        string propertyValue;
        public MyInstanceProvider(string propertyValue)
        {
            this.propertyValue = propertyValue;
        }

        public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
        }

        public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        {
        }

        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
        {
            endpointDispatcher.DispatchRuntime.InstanceProvider = this;
        }

        public void Validate(ServiceEndpoint endpoint)
        {
        }

        public object GetInstance(InstanceContext instanceContext, Message message)
        {
            return new Service { MyProperty = this.propertyValue };
        }

        public object GetInstance(InstanceContext instanceContext)
        {
            return new Service { MyProperty = this.propertyValue };
        }

        public void ReleaseInstance(InstanceContext instanceContext, object instance)
        {
        }
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
        ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(ITest), GetBinding(), "");
        endpoint.Behaviors.Add(new MyInstanceProvider("asd"));
        host.Open();
        Console.WriteLine("Host opened");

        ChannelFactory<ITest> factory = new ChannelFactory<ITest>(GetBinding(), new EndpointAddress(baseAddress));
        ITest proxy = factory.CreateChannel();
        Console.WriteLine(proxy.Echo("Hello"));

        ((IClientChannel)proxy).Close();
        factory.Close();

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}
于 2012-06-07T13:37:25.983 に答える
1

を作成しServiceHostて呼び出すOpenと、サービスはリクエストのリッスンを開始します。デフォルトの動作(この動作は変更できますが)では、Service1インスタンスはクライアント要求の処理時にのみ作成されます。つまり、クライアントリクエストがあるときはいつでもServiceHost、のインスタンスを作成し、Service1その適切なメソッド(クライアントが呼び出しているサービス操作)を呼び出してリクエストを処理します。したがって、からインスタンスを取得しようとはしません-そして確かにキャストすることはできません- (クライアント要求がない限りインスタンスはありません)。Service1ServiceHostService1

ServiceHosttoをキャストする必要がある理由の例を提供するService1と、別の方法を提供できる可能性があります。

于 2012-06-07T13:38:03.873 に答える