كيفية استضافة خدمتين WCF في خدمة Windows واحدة؟

StackOverflow https://stackoverflow.com/questions/54419

  •  09-06-2019
  •  | 
  •  

سؤال

لدي تطبيق WCF يحتوي على خدمتين أحاول استضافتهما في خدمة Windows واحدة باستخدام net.tcp.يمكنني تشغيل أي من الخدمتين بشكل جيد، ولكن بمجرد أن أحاول وضعهما في خدمة Windows، يتم تحميل الخدمة الأولى فقط.لقد قررت أنه يتم استدعاء عامل الخدمات الثاني ولكن OnStart لا يتم تشغيله أبدًا.يخبرني هذا أن WCF يجد شيئًا خاطئًا في تحميل تلك الخدمة الثانية.

باستخدام net.tcp أعلم أنني بحاجة إلى تشغيل مشاركة المنفذ وبدء خدمة مشاركة المنفذ على الخادم.ويبدو أن كل هذا يعمل بشكل صحيح.لقد حاولت وضع الخدمات على منافذ TCP مختلفة ولم أنجح بعد.

تبدو فئة تثبيت الخدمة الخاصة بي كما يلي:

 [RunInstaller(true)]
 public class ProjectInstaller : Installer
 {
      private ServiceProcessInstaller _process;
      private ServiceInstaller        _serviceAdmin;
      private ServiceInstaller        _servicePrint;

      public ProjectInstaller()
      {
            _process = new ServiceProcessInstaller();
            _process.Account = ServiceAccount.LocalSystem;

            _servicePrint = new ServiceInstaller();
            _servicePrint.ServiceName = "PrintingService";
            _servicePrint.StartType = ServiceStartMode.Automatic;

            _serviceAdmin = new ServiceInstaller();
            _serviceAdmin.ServiceName = "PrintingAdminService";
            _serviceAdmin.StartType = ServiceStartMode.Automatic;

            Installers.AddRange(new Installer[] { _process, _servicePrint, _serviceAdmin });
      }   
}

وكلا الخدمتين تبدو متشابهة جدًا

 class PrintService : ServiceBase
 {

      public ServiceHost _host = null;

      public PrintService()
      {
            ServiceName = "PCTSPrintingService";
            CanStop = true;
            AutoLog = true;

      }

      protected override void OnStart(string[] args)
      {
            if (_host != null) _host.Close();

            _host = new ServiceHost(typeof(Printing.ServiceImplementation.PrintingService));
            _host.Faulted += host_Faulted;

            _host.Open();
      }
}
هل كانت مفيدة؟

المحلول

قاعدة خدمتك على هذا مقالة MSDN وإنشاء مضيفين للخدمة.ولكن بدلًا من الاتصال فعليًا بكل مضيف خدمة مباشرةً، يمكنك تقسيمها إلى أي عدد تريده من الفئات التي تحدد كل خدمة تريد تشغيلها:

internal class MyWCFService1
{
    internal static System.ServiceModel.ServiceHost serviceHost = null;

    internal static void StartService()
    {
        if (serviceHost != null)
        {
            serviceHost.Close();
        }

        // Instantiate new ServiceHost.
        serviceHost = new System.ServiceModel.ServiceHost(typeof(MyService1));
        // Open myServiceHost.
        serviceHost.Open();
    }

    internal static void StopService()
    {
        if (serviceHost != null)
        {
            serviceHost.Close();
            serviceHost = null;
        }
    }
};

في نص مضيف خدمة Windows، قم باستدعاء الفئات المختلفة:

    // Start the Windows service.
    protected override void OnStart( string[] args )
    {
        // Call all the set up WCF services...
        MyWCFService1.StartService();
        //MyWCFService2.StartService();
        //MyWCFService3.StartService();


    }

ثم يمكنك إضافة أي عدد تريده من خدمات WCF إلى مضيف خدمة Windows واحد.

تذكر استدعاء طرق الإيقاف أيضًا....

نصائح أخرى

            Type serviceAServiceType = typeof(AfwConfigure);
            Type serviceAContractType = typeof(IAfwConfigure);

            Type serviceBServiceType = typeof(ConfigurationConsole);
            Type serviceBContractType = typeof(IConfigurationConsole);

            Type serviceCServiceType = typeof(ConfigurationAgent);
            Type serviceCContractType = typeof(IConfigurationAgent);

            ServiceHost serviceAHost = new ServiceHost(serviceAServiceType);
            ServiceHost serviceBHost = new ServiceHost(serviceBServiceType);
            ServiceHost serviceCHost = new ServiceHost(serviceCServiceType);
            Debug.WriteLine("Enter1");
            serviceAHost.Open();
            Debug.WriteLine("Enter2");
            serviceBHost.Open();
            Debug.WriteLine("Enter3");
            serviceCHost.Open();
            Debug.WriteLine("Opened!!!!!!!!!");

إذا كنت تريد أن تقوم إحدى خدمات Windows بتشغيل خدمتين من خدمات WCF، فستحتاج إلى ServiceInstaller واحد يحتوي على مثيلين من ServiceHost، وكلاهما يتم تشغيلهما بطريقة OnStart (المفردة).

قد ترغب في اتباع نمط ServiceInstaller الموجود في رمز القالب عندما تختار إنشاء خدمة Windows جديدة في Visual Studio - بشكل عام يعد هذا مكانًا جيدًا للبدء.

ربما تحتاج فقط إلى مضيفين للخدمة.

_host1 و_host2.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top