3

サーバーで WCF サービスをホストしている Windows サービスがあります。InstanceContextMode.PerSession属性を使用しています。サービスは私の要件に従ってうまく機能します。

私は今、できれば Windows フォームのリスト ボックスに、ロガーのような WCF サービスの視覚的なフィードバックを実装したいと考えています。すべてのクライアントからのすべての通話とその後のアクションをこのフォームに記録したいと考えています。サービスの UI を持つことは良い考えではないことを読みました。誰かがスレッドセーフな方法でこれを達成する方向に私を向けることができますか?

4

4 に答える 4

4

最も簡単な答えはこれだと思います。基本的にできることは、wcf サービスのカスタム トレース リスナーを定義することです。必要な結果を得るために例を変更できます。

カスタム トレースの実装は次のようになります。

namespace WcfTrace.Trace
{
    public class WebTraceListener : TraceListener
    {
        public override void Write(string message)
        {
            //write you custom code here
            Debug.WriteLine(message);
        }

        public override void WriteLine(string message)
        {
            //write your custom code here
            Debug.WriteLine(message);
        }
    }
}

サービス ホストの構成には、次のものが含まれている必要があります。

<system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
        <listeners>
          <add name="xml" />
        </listeners>
      </source>
      <source name="System.ServiceModel.MessageLogging">
        <listeners>
          <add name="xml" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add name="xml" type="WcfTrace.Trace.WebTraceListener,WcfTrace.Trace" />
    </sharedListeners>
  </system.diagnostics>

  <system.serviceModel>
    <diagnostics>
      <messageLogging
      logEntireMessage="true"
      logMalformedMessages="false"
      logMessagesAtServiceLevel="true"
      logMessagesAtTransportLevel="false"
      maxMessagesToLog="300000"
      maxSizeOfMessageToLog="200000"/>
    </diagnostics>
  </system.serviceModel>

個人的に私はこのアイデアが好きです。クライアントから独立したトレーサー クラス (あなたが言及したリストボックスを持つアプリ) は、このカスタム トレース実装からの情報を消費することができます。

于 2012-09-18T17:16:27.233 に答える
1

サービスには UI がありませんが、ホストにはあります。

これは単なるコンソール ホストですが、サービスからのテキストが表示されます。

Service 内のこれらの Console.WriteLine は、ホストに表示されます。

namespace MagicEightBallServiceHost
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("**** Console Based WCF Host *****");

            using (ServiceHost serviceHost = new ServiceHost(typeof(MagicEightBallService)))
            {
                serviceHost.Open();
                Console.WriteLine("The service is running");
                Console.ReadLine();
            }

[ServiceBehavior (InstanceContextMode=InstanceContextMode.PerSession)]
    public class MagicEightBallService : IEightBall, IDisposable
    {
        private DateTime serviceStartTime;
        public void Dispose()
        {

            Console.WriteLine("Eightball dispose ... " + OperationContext.Current.SessionId.ToString() + " " + serviceStartTime.ToLongTimeString());          
        }
        public MagicEightBallService()
        {
            serviceStartTime = DateTime.Now;
            Console.WriteLine("Eightball awaits your question " + OperationContext.Current.SessionId.ToString() + " " + serviceStartTime.ToLongTimeString());
        }
        public string ObtainAnswerToQuestion(string userQuestion)
        {
            Console.WriteLine("Eightball ObtainsAnser " + OperationContext.Current.SessionId.ToString() + " " + serviceStartTime.ToLongTimeString());
            return "maybe " + OperationContext.Current.SessionId.ToString() + " " + serviceStartTime.ToLongTimeString() ;
        }
于 2012-09-18T15:49:13.490 に答える
1

あなたが本質的に話しているのは、何か「興味深い」ことが起こったときに、Windows サービス内の WCF サービスが UI フロントエンドにイベント通知を提供することです。幸いなことに、 『 Programming WCF Services』の著者であるJuval Lowyによって開発されたPublish-Subscribe Frameworkがあります。詳細はこの優れた MSDN 記事に記載されており、ソース コードはLowy の Web サイトで無料で入手できます。

このフレームワークの優れた点は、パブリッシャー (Windows サービス内の WCF サービスなど) をサブスクライバー (GUI など) から切り離すことです。パブリッシャーは、常に利用可能な Pub/Sub サービスに関心のあるイベントを「公開」します。パブリッシャーの観点からは、サブスクライバーが存在するかどうかは問題ではありません。Pub/Sub サービスは、すべての登録済みサブスクライバーへのイベントのルーティングを処理します。このようにして、Windows サービスの WCF サービスはイベントが発生すると発行し、GUI は Pub/Sub サービスの読み込み/終了時にそれをサブスクライブ/サブスクライブ解除し、Pub/Sub サービスはイベントが発生すると GUI に通知します。

私は自分のプロジェクトでこのセットアップを使用しましたが、非常にうまく機能します。

編集: Windows サービスでホストされている WCF サービスからのイベントを表示する独自の UI が必要であることを理解しています。もう 1 つのオプションは、Windows ネイティブのイベント ビューアー (eventvwr.msc) からアクセスできるアプリケーション ログを利用することです。このアプローチが受け入れられる場合は、こちらの手順を参照して、Windows サービスからセットアップする方法を確認してください。

于 2012-09-18T16:57:15.083 に答える
0

log4netなどを使用して、対象の Web サービス アクティビティを表す、表示する情報をログに記録します。log4net を使用すると、構成ファイルを変更するだけで、ログに記録される情報の種類をフィルター処理できます。構成ファイルに記録することで、情報の場所と方法を変更することもできます。log4net 用に構成できるアペンダーの 1 つはSysLogAppenderです。これにより、ログ情報がリモートのSysLog サーバーに送信されます(Web サービスと共に展開することもできます)。Kiwiのように利用可能な SysLog サーバーが多数あります。ログイベントのローリング表示を提供し、特定のイベントに対するフィルターとアクションを提供します (例: エラーが発生したときに管理者に電子メールを送信します)。オープン ソースの SysLog サーバーも利用できます。これにより、ログ情報の表示と処理が実際のログ記録から効果的に分離されます。

于 2012-09-18T18:00:50.053 に答える