1

データ入力と請求を処理する winform アプリケーションがあります。ローカル LAN 経由でのみアクセスできる WCF サービスを追加したいと考えています。課金プログラムでデータベースにクエリを実行し、クライアントのデータを取得したいと考えています。別のプログラムを作成するのではなく、同じプログラムでこれを行うことが重要です。

私の質問は、新しい WCF サービスを作成するのではなく、既存の winform アプリケーションから開始する場合に、このような WCF サービスをセットアップするのが難しいことです。ディレクティブを使用して適切な設定を行うのは単純な問題ですか、それとも最初から WCF サービスとして設定していないため、根本的に欠けているものがありますか?

もう 1 つの懸念は、スレッド化について心配する必要があるか、それとも WCF サービスによって自動的に処理されるかということです。たとえば、10 台のコンピューターすべてが同時に winforms アプリケーションにクエリを実行する場合、WCF はそれをシームレスに処理しますか?それとも、これを処理するために追加の機能を実装する必要がありますか?

読んでくれてありがとう

4

3 に答える 3

7

基本的に、WCF サービスを作成するには、次の 3 つのものが必要です。

  • サービスが提供するメソッドを定義するためのサービス コントラクト(通常は .NET インターフェイスとして表現される)。これには、メソッドが期待する (場合によっては返す) データ型も含まれます。

    [ServiceContract(Namespace="http://services.yourcompany.com/Service/2012/08")]
    interface IMyService
    {
       [OperationContract]
       SomeReturnType ThisIsYourMethod(string input, int value, .....);
    }
    
    [DataContract(Namespace="http://data.yourcompany.com/Service/2012/08")]
    public class SomeReturnType
    {
       [DataMember] 
       public string Name { get; set; }
    
       [DataMember]
       public int Age { get; set; }  
    }
    
  • 呼び出される実際のサービス コードを作成するサービス実装。これは、サービス コントラクトを実装する単純な .NET クラスです。

    public class MyServiceImplementation : IMyService
    {
         SomeReturnType ThisIsYourMethod(string input, int value, .....)
         {
             /// .... do some processing, fetch data etc.
             return ......
         }
     }
    
  • 実際に WCF ランタイムをホストし、WCF 処理全体をスピンアップするサービスホスト。これは、ServiceHostサービスをホストできるインスタンス (または派生クラス) です。このクラスは、Winforms アプリケーションの起動プロセスのどこかでインスタンス化して開く必要があります。サービス ホストが開いたら、サービスを外部から呼び出すことができます。Winforms アプリケーションが終了するときは、必ずサービス ホストを閉じる必要があります。

  • app.configさらに、WCF サービスが世界に提供するエンドポイント (アドレス、バインディング、コントラクト) を定義するために、ファイルにいくつかの構成設定が必要になる場合があります。

したがって、これは非常に簡単です。Winform プロジェクトでこれらの項目を作成するだけで完了です。

于 2012-08-03T06:36:49.720 に答える
4

この記事のHosting and Consuming WCF Services をご覧ください。

WCF ServiceHost をホストする Windows サービス(この記事の例)

using System;
using System.ServiceModel;
using System.ServiceProcess;
using QuickReturns.StockTrading.ExchangeService;

namespace QuickReturns.StockTrading.ExchangeService.Hosts
{
    public partial class ExchangeWindowsService : ServiceBase
    {
        ServiceHost host;

        public ExchangeWindowsService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            Type serviceType = typeof(TradeService);
            host = new ServiceHost(serviceType);
            host.Open();
        }

        protected override void OnStop()
        {
            if(host != null)
               host.Close();
        }
    }
}

もう 1 つの懸念事項は、スレッド化について心配する必要があるか、それとも WCF サービスによって自動的に処理されるかということです。たとえば、10 台のコンピューターすべてが同時に winforms アプリケーションにクエリを実行する場合、WCF はそれをシームレスに処理しますか?それとも、これを処理するために追加の機能を実装する必要がありますか?

wcf はこの負荷を簡単に処理できると思います。ただし、実行する操作によって異なります。

于 2012-08-03T06:35:02.860 に答える
1

WindowsサービスおよびWebサービスとしてホストされているサービスの場合、クライアントは、公開されている契約メンバーにアクセスするためのプロキシクラスも必要です。

于 2012-08-03T06:46:59.967 に答える