2016-11-14 4 views
1

私は、WCFサービスはホストからWCFサービスにデータを取得/設定できますか?

どのような方法がWindowsServiceHostにWCFServiceからデータを取得あり(WindowsFormsApp <> WindowsServiceHostを通信する)WindowsServiceHost上でホストされていますか? そして、他の方法で(WCFServiceへWindowsServiceHostから設定データ)

私が何を行っているされて

:、

  1. 私はWCFサービスライブラリのプロジェクトを作った実装されたインタフェース、契約など
  2. <system.serviceModel> 
    <bindings> 
        <netTcpBinding> 
        <binding name="netTcp"> 
         <security mode="Message"> 
         </security> 
        </binding> 
        </netTcpBinding> 
    </bindings> 
    <behaviors> 
        <serviceBehaviors> 
        <behavior name="mexBehavior"> 
         <serviceMetadata httpGetEnabled="true"/> 
        </behavior> 
        </serviceBehaviors> 
    </behaviors> 
    <services> 
        <service behaviorConfiguration="mexBehavior" name="KSPDJOBWinWCFService.KSPDJOBWinWCFService" > 
        <endpoint address="KSPDJOBWinWCFService" binding="netTcpBinding" contract="KSPDJOBWinWCFService.IKSPDJOBWinWCFService" bindingConfiguration="netTcp" /> 
        <host> 
         <baseAddresses> 
         <add baseAddress="http://localhost:8079"/> 
         <add baseAddress="net.tcp://localhost:8090"/> 
         </baseAddresses> 
        </host> 
        </service> 
    </services> 
    
    :#1から突出すると
  3. 設定さapp.confをSystem.ServiceModelするには、Windowsサービスと追加された参照 - 私は、新しいプロジェクトを作成しました私は、Windowsサービス

    protected override void OnStart(string[] args) 
    { 
        host = new ServiceHost(typeof(KSPDJOBWinWCFService.KSPDJOBWinWCFService)); 
        host.Open(); 
    } 
    
  4. ののOnStartメソッドでWCFを主催しました

  5. は(WCFクライアントなど)WinformsClientアプリで新しいソリューションを追加し、通信をテスト - すべての作業罰金を。

  6. 問題は、私はWinFormsClientからWCFサービスに値を送信した場合で、Windowsサービスaplicationから任意のヘルプのための

おかげで、それを読みたいです。

+0

あなたが実装したWindowsサービス( 'ServiceBase'によって派生した別のサービス)の中にあなたのWCFサービスをホストしていますか?そして、あなたがデータを交換したいと思うそれらのサービスの間で、それは正しいですか?もしそうなら、WCFサービスのホスティング方法をコードに貼り付けることができますか? – Marc

+1

こんにちはマーク私はあなたに答えました – Endriu

答えて

3

グローバル変数でWCFサービスインスタンスを保持し、イベントを扱うことができます。このサンプルでは、​​WCFサービスKSPDJOBWinWCFServiceがイベントEventAを公開し、サービスホストがそれを処理します。これは、WCFクライアントから送信された値を処理できる場所です。

public class CustomEventArgs : EventArgs 
{ 
    public int Value { get; set; } 

    public CustomEventArgs(int value) 
    { 
     Value = value; 
    } 
} 

ます。また、公開することができます。

public class KSPDJOBWinWCFService : IKSPDJOBWinWCFService 
{ 
    public event EventHandler<CustomEventArgs> EventA; 

    public bool SomeWcfOperation(int value) 
    { 
     EventA?.Invoke(this, new CustomEventArgs(value)); 

     return true; 
    } 
} 

があなたのニーズを満たすイベント引数を作成します。

public partial class Service : ServiceBase 
{ 
    private ServiceHost _host; 
    private KSPDJOBWinWCFService _instance; 

    protected override void OnStart(string[] args) 
    { 
     try 
     { 
      _instance = new KSPDJOBWinWCFService(); 
      _instance.EventA += HandleEventA; 
      _host = new ServiceHost(_instance); 
      _host.Open(); 
     } 
     catch (Exception ex) 
     { 
      // Logging 
     } 
    } 

    public void HandleEventA(object sender, CustomEventArgs e) 
    { 
     // do whatever you want here 
     var localVar = e.Value; 
    } 

    protected override void OnStop() 
    { 
     try 
     { 
      if (_instance != null) 
      { 
       _instance.Dispose(); 
      } 
      _host.Close(); 
     } 
     catch (Exception ex) 
     { 
      // Logging 
     } 
    } 
} 

は、WCFサービスは、WCFクライアントから送信された値と一緒にこのイベントを発生させますWCFサービスのパブリックプロパティを持つ値。しかし、イベントも必要です。

+0

ハーマンのように働いて:))ありがとうございました。私はWCFServiceクラスの下に '[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]'を追加しなければなりませんでした: 'public class KSPDJOBWinWCFService:IKSPDJOBWinWCFService' – Endriu

関連する問題