मैं विजुअल स्टूडियो में विंडोज सेवाओं को कैसे डिबग करूं?


85

क्या दृश्य स्टूडियो में विंडोज सेवाओं को डिबग करना संभव है?

मैंने जैसे कोड का इस्तेमाल किया

System.Diagnostics.Debugger.Break();

लेकिन यह कुछ कोड त्रुटि दे रहा है जैसे:

मुझे दो ईवेंट त्रुटि मिली: EventID 4096 VsJITDebugger और "सेवा ने समय पर फैशन में शुरुआत या नियंत्रण अनुरोध का जवाब नहीं दिया।"

जवाबों:


124

सेवा OnStartपद्धति में निम्नलिखित कोड का उपयोग करें :

System.Diagnostics.Debugger.Launch();

पॉप अप संदेश से विजुअल स्टूडियो विकल्प चुनें।

नोट: इसे केवल डीबग मोड में उपयोग करने के लिए, एक #if DEBUGकंपाइलर निर्देश का उपयोग किया जा सकता है, निम्नानुसार। यह एक प्रोडक्शन सर्वर पर रिलीज मोड में आकस्मिक या डिबगिंग को रोक देगा।

#if DEBUG
    System.Diagnostics.Debugger.Launch();
#endif

9
वीएस को प्रशासक के रूप में चलाने के लिए याद रखें। फिर यह सूची में उपलब्ध होगा।
माइकल

1
क्या कोई स्पष्ट कर सकता है कि पॉप अप संदेश का क्या मतलब है? कब / कैसे प्रकट होता है?
माइक

@ माइक, इंस्टॉल करें और सेवा शुरू करें, यह दिखाई देगा।
हर्षित

@ माइक, इसका एक विंडोज डायलॉग बॉक्स जो इंटरैक्टिव (लॉग इन) डेस्कटॉप पर पॉप अप करता है और पूछता है कि क्या आप इस प्रक्रिया को डिबग करने के लिए ऐप चुनना चाहते हैं। यदि आप वीएस को चुनते हैं तो यह डिबगर लॉन्च करेगा और प्रक्रिया में संलग्न होगा
क्रिस जॉनसन

63

आप भी इसे आजमा सकते हैं।

  1. अपनी विंडोज सर्विस बनाएं और इंस्टॉल करें और शुरू करें…। यानी, विंडोज सिस्टम आपके सिस्टम में चलना चाहिए।
  2. जब आपकी सेवा चल रही हो, तो डिबग मेनू पर जाएं, अटैच प्रक्रिया (या पुराने विज़ुअल स्टूडियो में प्रक्रिया) पर क्लिक करें
  3. अपने चल रहे सेवा का पता लगाएं, और उसके बाद सुनिश्चित करें कि सभी उपयोगकर्ताओं से प्रक्रिया दिखाएँ और सभी सत्रों में प्रक्रियाएं दिखाएं चयन किया जाता है, अगर फिर उसे चुनने के नहीं।

यहां छवि विवरण दर्ज करें

  1. अटैच बटन पर क्लिक करें
  2. ओके पर क्लिक करें
  3. बंद करें पर क्लिक करें
  4. अपने वांछनीय स्थान पर एक विराम बिंदु सेट करें और निष्पादित होने की प्रतीक्षा करें। जब भी आपका कोड उस बिंदु तक पहुंचता है, यह स्वचालित रूप से डिबग करेगा।
  5. याद रखें, अपने ब्रेकपॉइंट को पहुंच योग्य जगह पर रखें, अगर यह ऑनस्टार्ट () है, तो रुकें और फिर से सेवा शुरू करें

(बहुत सारी गुगली करने के बाद, मैंने इसे "विजुअल स्टूडियो में विंडोज सर्विसेज डिबग करने का तरीका" पाया।)


2
VS2013 अपडेट 5 में इस विकल्प को नहीं देख सकते हैं :(
sandeep talabathula

1
लेकिन आपको अपना Vs-2017 प्रशासक के रूप में चलाने की आवश्यकता है
chozha rajan

1
मैंने यह कोशिश की। इसने onStop में एक ब्रेकपॉइंट के साथ काम किया, लेकिन ऑनस्टार्ट पर नहीं क्योंकि जब सेवा बंद हो जाती है तो डिबगर अनासक्त हो जाता है
KansaiRobot

22

आप बाहर सभी कोड कि अलग करना चाहिए करना एक अलग परियोजना में सेवा परियोजना से सामान, और फिर एक परीक्षण आवेदन है कि आप चलाने के लिए और डिबग कर सकते हैं सामान्य रूप से करते हैं।

सेवा परियोजना सिर्फ शेल होगी जो इसके सेवा भाग को लागू करने के लिए आवश्यक है।


OOW !! ctrl + C फिर ctrl + V, मेरा मतलब नए प्रोजेक्ट से है। हां केवल मैं ही कर रहा हूं। क्या अलग परियोजना के बजाय डिबग या किसी अन्य विकल्प के लिए किसी भी प्रक्रिया को संलग्न करना संभव नहीं है? "
पवन जनस

1
बेशक यह संभव है, लेकिन अगर आप विकास के दौरान सेवा का हिस्सा निकालते हैं तो विंडोज़ सेवा विकसित करना बहुत आसान है।
लास वी। कार्लसन

हम्म् ... यह अच्छा तरीका है लेकिन बस यह काम दोगुना कर देता है। मुझे लगा कि कोई और रास्ता मौजूद होगा।
पवन जनस

9
मैं यह नहीं देखता कि यह कैसे "डबल" होगा। निश्चित रूप से, यह अतिरिक्त परियोजना बनाने और एक तीसरी परियोजना के लिए सेवा में कोड को अलग करने में एक छोटा सा ओवरहेड जोड़ देगा, लेकिन इसके अलावा, आप कोड की प्रतिलिपि नहीं बनायेंगे, आप इसे स्थानांतरित करेंगे। और संदर्भ है कि परियोजना।
लास वी। कार्लसन

3
^ + 1। यह सेवा के प्रबंधन के लिए काम को दोगुना करता है, जो कि विकास के समय के मामले में बहुत अधिक शून्य है, और आप इसे केवल एक बार करते हैं। सीरीज़ को डिबग करना PAINFUL है - बल्कि इसे कमांड लाइन के रूप में दोहरी शुरुआत बनाते हैं। ऐसा करने की अनुमति देने वाले पूर्वनिर्धारित रैपर कक्षाओं के लिए Google की जांच करें (वे प्रारंभ का उपयोग / कोई तह सेवा वर्ग को रोकने के लिए प्रतिबिंब का उपयोग करते हैं)। एक घंटे का काम, बचत के टन, शुद्ध नुकसान: नकारात्मक - आप समय हासिल करते हैं।
टॉमटॉम

14

या तो जैसा कि लेसे वी। कार्लसन द्वारा सुझाया गया है, या अपनी सेवा में एक लूप सेट करें जो संलग्न करने के लिए डिबगर की प्रतीक्षा करेगा। सबसे सरल है

while (!Debugger.IsAttached)
{
    Thread.Sleep(1000);
}

... continue with code

इस तरह आप सेवा शुरू कर सकते हैं और विज़ुअल स्टूडियो के अंदर आप "अटैच टू प्रोसेस ..." चुनते हैं और अपनी सेवा से जुड़ जाते हैं जो फिर सामान्य सावधानी से शुरू होगी।


मुझे उपर्युक्त कोड कहां रखना चाहिए ... और संलग्न प्रक्रिया में मुझे मेरी सेवा अक्षम हो रही है
PawanS

3
हमने इस तरह के कोड का भी इस्तेमाल किया if (Environment.UserInteractive) { InteractiveRun(args); } else { Service instance = new Service(); ServiceBase[] servicesToRun = new ServiceBase[] { instance }; ServiceBase.Run(servicesToRun); }
कोवलेंको

किसी भी कोड को चलाने में सक्षम होने से पहले वह कोड जितना संभव हो उतना जल्दी होना चाहिए।
पौली Paulsterø

@ पवन: में Start/ OnStart()मुझे लगता है
११:११

@Kirill: टिप्पणियों के अंदर कोड को उजागर करने के लिए टिल्ड का उपयोग करें, जैसेfoo(bar)
abatishchev

7

दृश्यता ServiceBase.OnStartको देखते हुए protected, मैं डिबगिंग को प्राप्त करने के लिए परावर्तन मार्ग से नीचे चला गया।

private static void Main(string[] args)
{
    var serviceBases = new ServiceBase[] {new Service() /* ... */ };

#if DEBUG
    if (Environment.UserInteractive)
    {
        const BindingFlags bindingFlags =
            BindingFlags.Instance | BindingFlags.NonPublic;

        foreach (var serviceBase in serviceBases)
        {
            var serviceType = serviceBase.GetType();
            var methodInfo = serviceType.GetMethod("OnStart", bindingFlags);

            new Thread(service => methodInfo.Invoke(service, new object[] {args})).Start(serviceBase);
        }

        return;
    }
#endif

    ServiceBase.Run(serviceBases);
}

ध्यान दें Thread, डिफ़ॉल्ट रूप से, एक अग्रभूमि धागा। returnआईएनजी से Mainफ़ॉक्स-सर्विस थ्रेड चल रहे हैं, इस प्रक्रिया को समाप्त नहीं करेंगे।


चूंकि OnStart जल्दी लौटने वाला है, इसलिए आपको इसे किसी अन्य थ्रेड में करने की आवश्यकता नहीं है। हालाँकि, यदि सेवा दूसरा थ्रेड प्रारंभ नहीं करती है, तो आपकी प्रक्रिया तुरंत समाप्त हो जाएगी।
मैट कोनोली

@MattConnolly उत्तरार्द्ध पर: यदि आवश्यक हो, तो मैं एक अग्रभूमि धागा शुरू करने के लिए उपरोक्त कोड को बदलता हूं जो हमेशा (सामान्य प्रसंस्करण से पहले) सोता है।
ta.speot.is

यह एक वास्तविक उत्तर होना चाहिए। खूबसूरती से काम करता है!
lentai

4

माइक्रोसॉफ्ट का एक लेख बताता है कि यहां विंडोज सेवा को कैसे डिबग किया जाए और अगर कोई प्रक्रिया में संलग्न होकर इसे डिबग करता है तो कोई भी कैसे चूक सकता है।

नीचे मेरा काम कोड है। मैंने Microsoft द्वारा सुझाए गए दृष्टिकोण का पालन किया है।

इस कोड को इसमें जोड़ें program.cs:

static void Main(string[] args)
{
    // 'If' block will execute when launched through Visual Studio
    if (Environment.UserInteractive)
    {
        ServiceMonitor serviceRequest = new ServiceMonitor();
        serviceRequest.TestOnStartAndOnStop(args);
    }
    else // This block will execute when code is compiled as a Windows application
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[]
        {
            new ServiceMonitor()
        };
        ServiceBase.Run(ServicesToRun);
    }
}

इस कोड को ServiceMonitor वर्ग में जोड़ें।

internal void TestOnStartAndOnStop(string[] args)
{
    this.OnStart(args);
    Console.ReadLine();
    this.OnStop();
}

अब प्रोजेक्ट प्रॉपर्टीज पर जाएं , टैब "एप्लिकेशन" चुनें और डिबगिंग करते समय "कंसोल एप्लिकेशन" के रूप में आउटपुट प्रकार चुनें , या डीबगिंग के साथ किया गया "विंडोज एप्लिकेशन" और अपनी सेवा को स्थापित करें।

यहां छवि विवरण दर्ज करें


1
रिलीज में डिबग और विंडो एप्लिकेशन में कंसोल एप्लिकेशन पर आउटपुट सेट करने का एक तरीका है?
कोफीफस

3

आप एक कंसोल एप्लिकेशन बना सकते हैं। मैं इस mainफ़ंक्शन का उपयोग करता हूं :

    static void Main(string[] args)
    {
        ImportFileService ws = new ImportFileService();
        ws.OnStart(args);
        while (true)
        {
            ConsoleKeyInfo key = System.Console.ReadKey();
            if (key.Key == ConsoleKey.Escape)
                break;
        }
        ws.OnStop();
    }

मेरी ImportFileServiceकक्षा बिल्कुल वैसी ही है जैसे मेरी विंडोज सेवा के आवेदन में, इनहेरिटेंट ( ServiceBase) को छोड़कर ।


क्या यह उसी प्रोजेक्ट पर है या मैं इस कंसोल ऐप के लिए एक और प्रोजेक्ट
पवन जनस १३'११ को १३:२३

यह समान वर्गों के साथ 2 भिन्न परियोजनाएं हैं। मेरे मामले में, यह केवल एक साधारण सेवा है जिसमें केवल ImportFileService वर्ग wihch डुप्लिकेट है। जब मैं देव / परीक्षण करना चाहता हूं, तो मैं कंसोल का उपयोग करता हूं, और फिर कॉपी / पेस्ट करता हूं। जैसा कि लेसे वी। कार्लसन ने कहा, यह एक डिबग कार्यक्रम है, सभी तर्क (व्यवसाय) एक तीसरी परियोजना पर है।
केरुबिन

OnStart संरक्षित नहीं है?
जो फिलिप्स

हाँ, है। इसलिए मैंने कहा "विरासत में छोड़कर ( ServiceBase)।" मुझे कंसोल ऐप में डीबग करना आसान लगता है, लेकिन मुझे समझ में आता है कि अगर यह सभी को मना नहीं करता है।
केरुबिन

3

मैं ServiceProcess.Helpers नामक एक महान Nuget पैकेज का उपयोग करता हूं।

और मैं बोली ...

यह विंडोज़ सेवाओं को डिबगिंग के साथ चलने पर प्ले / स्टॉप / पॉज़ यूआई बनाकर डिबगिंग में मदद करता है, लेकिन यह भी सेवा को विंडोज़ सर्वर वातावरण द्वारा स्थापित और चलाने की अनुमति देता है।

कोड की एक पंक्ति के साथ यह सब।

http://windowsservicehelper.codeplex.com/

एक बार स्थापित और वायर्ड करने के बाद आपको अपनी विंडोज़ सर्विस प्रोजेक्ट को स्टार्ट-अप प्रोजेक्ट के रूप में सेट करना होगा और अपने डीबगर पर स्टार्ट पर क्लिक करना होगा।


साझा करने के लिए धन्यवाद! यह अब तक का सबसे सरल उपाय था!
वेलिंगटन ज़ानेली

2

आप System.Diagnostics.Debugger.Launch () विधि भी आज़मा सकते हैं । यह डिबगर पॉइंटर को निर्दिष्ट स्थान पर ले जाने में मदद करता है और फिर आप कोड को डीबग कर सकते हैं।

इस चरण से पहले Visual Studio कमांड प्रॉम्प्ट की कमांड लाइन का उपयोग करके अपने service.exe को स्थापित करें - installutil projectervice.exe

फिर कंट्रोल पैनल से अपनी सेवा शुरू करें -> प्रशासनिक उपकरण -> कंप्यूटर प्रबंधन -> सेवा और अनुप्रयोग -> सेवाएं -> आपकी सेवा का नाम


2

मैंने अभी इस कोड को अपनी सेवा वर्ग में जोड़ा है ताकि मैं अप्रत्यक्ष रूप से ऑनस्टार्ट को OnStop के समान कह सकूं।

    public void MyOnStart(string[] args)
    {
        OnStart(args);
    }

2

मैं /ConsoleVisual Studio प्रोजेक्ट डिबगस्टार्ट ऑप्शनकमांड लाइन आर्ग्युमेंट्स में पैरामीटर का उपयोग कर रहा हूँ :

public static class Program
{
    [STAThread]
    public static void Main(string[] args)
    {
         var runMode = args.Contains(@"/Console")
             ? WindowsService.RunMode.Console
             : WindowsService.RunMode.WindowsService;
         new WinodwsService().Run(runMode);
    }
}


public class WindowsService : ServiceBase
{
    public enum RunMode
    {
        Console,
        WindowsService
    }

    public void Run(RunMode runMode)
    {
        if (runMode.Equals(RunMode.Console))
        {
            this.StartService();
            Console.WriteLine("Press <ENTER> to stop service...");
            Console.ReadLine();

            this.StopService();
            Console.WriteLine("Press <ENTER> to exit.");
            Console.ReadLine();
        }
        else if (runMode.Equals(RunMode.WindowsService))
        {
            ServiceBase.Run(new[] { this });
        }
    }

    protected override void OnStart(string[] args)
    {
        StartService(args);
    }

    protected override void OnStop()
    {
        StopService();
    }

    /// <summary>
    /// Logic to Start Service
    /// Public accessibility for running as a console application in Visual Studio debugging experience
    /// </summary>
    public virtual void StartService(params string[] args){ ... }

    /// <summary>
    /// Logic to Stop Service
    /// Public accessibility for running as a console application in Visual Studio debugging experience
    /// </summary>
    public virtual void StopService() {....}
}

2

मुझे यह प्रश्न मिला, लेकिन मुझे लगता है कि एक स्पष्ट और सरल उत्तर गायब है।

मैं अपने डिबगर को एक प्रक्रिया में संलग्न नहीं करना चाहता, लेकिन मैं अभी भी सेवा OnStartऔर OnStopविधियों को कॉल करने में सक्षम होना चाहता हूं । मैं यह भी चाहता हूं कि यह एक कंसोल एप्लिकेशन के रूप में चले, ताकि मैं एनएलओजी से कंसोल पर जानकारी लॉग कर सकूं

मुझे ये शानदार गाइड मिले जो ऐसा करता है:

परियोजनाओं Output typeको बदलकर शुरू करें Console Application

यहां छवि विवरण दर्ज करें

Program.csइस तरह दिखने के लिए अपने को बदलें :

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    static void Main()
    {
        // Startup as service.
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[]
        {
            new Service1()
        };

        if (Environment.UserInteractive)
        {
            RunInteractive(ServicesToRun);
        }
        else
        {
            ServiceBase.Run(ServicesToRun);
        }
    }
}

फिर इंटरैक्टिव मोड में चलने वाली सेवाओं की अनुमति देने के लिए निम्न विधि जोड़ें।

static void RunInteractive(ServiceBase[] servicesToRun)
{
    Console.WriteLine("Services running in interactive mode.");
    Console.WriteLine();

    MethodInfo onStartMethod = typeof(ServiceBase).GetMethod("OnStart",
        BindingFlags.Instance | BindingFlags.NonPublic);
    foreach (ServiceBase service in servicesToRun)
    {
        Console.Write("Starting {0}...", service.ServiceName);
        onStartMethod.Invoke(service, new object[] { new string[] { } });
        Console.Write("Started");
    }

    Console.WriteLine();
    Console.WriteLine();
    Console.WriteLine(
        "Press any key to stop the services and end the process...");
    Console.ReadKey();
    Console.WriteLine();

    MethodInfo onStopMethod = typeof(ServiceBase).GetMethod("OnStop",
        BindingFlags.Instance | BindingFlags.NonPublic);
    foreach (ServiceBase service in servicesToRun)
    {
        Console.Write("Stopping {0}...", service.ServiceName);
        onStopMethod.Invoke(service, null);
        Console.WriteLine("Stopped");
    }

    Console.WriteLine("All services stopped.");
    // Keep the console alive for a second to allow the user to see the message.
    Thread.Sleep(1000);
}

महान कोड! सरल, प्रभावी। +1। लेकिन आसान के रूप में मैं यह एक फार्म app बना दिया। मुझे वास्तव में कंसोल एप्स से नफरत है। साथ ही, आप प्रत्येक सेवा ईवेंट के लिए आसानी से फ़ॉर्म बटन लागू कर सकते हैं।
रोलैंड

1

दुर्भाग्य से, अगर आप विंडोज सर्विस ऑपरेशन के शुरू में कुछ डिबग करने की कोशिश कर रहे हैं, तो रनिंग प्रोसेस के लिए "अटैचमेंट" काम नहीं करेगा। मैंने OnStart प्रॉसीक्योर के भीतर Debugger.Break () का उपयोग करने की कोशिश की, लेकिन एक 64-बिट, विजुअल स्टूडियो 2010 के संकलित अनुप्रयोग के साथ, ब्रेक कमांड सिर्फ इस तरह एक त्रुटि फेंकता है:

System error 1067 has occurred.

उस बिंदु पर, आपको अपने निष्पादन योग्य के लिए अपनी रजिस्ट्री में "छवि फ़ाइल निष्पादन" विकल्प सेट करना होगा। इसे स्थापित करने में पाँच मिनट लगते हैं, और यह बहुत अच्छी तरह से काम करता है। यहाँ एक Microsoft आलेख है जहाँ विवरण हैं:

कैसे करें: डीबगर को स्वचालित रूप से लॉन्च करें


1

Visual Studio की स्वयं की पोस्ट-बिल्ड इवेंट कमांड लाइन का प्रयास करें

निर्माण के बाद इसे जोड़ने की कोशिश करें:

@echo off
sc query "ServiceName" > nul
if errorlevel 1060 goto install
goto stop

:delete
echo delete
sc delete "ServiceName" > nul
echo %errorlevel%
goto install

:install
echo install
sc create "ServiceName" displayname= "Service Display Name" binpath= "$(TargetPath)" start= auto > nul
echo %errorlevel%
goto start

:start
echo start
sc start "ServiceName" > nul
echo %errorlevel%
goto end

:stop
echo stop
sc stop "ServiceName" > nul
echo %errorlevel%
goto delete

:end

यदि इस तरह के संदेश के साथ बिल्ड त्रुटि Error 1 The command "@echo off sc query "ServiceName" > nul, Ctrl+ Cतो Ctrl+ Vनोटपैड में त्रुटि संदेश और संदेश के अंतिम वाक्य को देखें।

यह कह सकता है exited with code x। यहां कुछ सामान्य त्रुटि में कोड देखें और इसे हल करने का तरीका देखें।

1072 -- Marked for deletion → Close all applications that maybe using the service including services.msc and Windows event log.
1058 -- Can't be started because disabled or has no enabled associated devices → just delete it.
1060 -- Doesn't exist → just delete it.
1062 -- Has not been started → just delete it.
1053 -- Didn't respond to start or control → see event log (if logged to event log). It may be the service itself throwing an exception.
1056 -- Service is already running → stop the service, and then delete.

यहां त्रुटि कोड पर अधिक ।

और अगर इस तरह से संदेश के साथ निर्माण त्रुटि,

Error    11    Could not copy "obj\x86\Debug\ServiceName.exe" to "bin\Debug\ServiceName.exe". Exceeded retry count of 10. Failed.    ServiceName
Error    12    Unable to copy file "obj\x86\Debug\ServiceName.exe" to "bin\Debug\ServiceName.exe". The process cannot access the file 'bin\Debug\ServiceName.exe' because it is being used by another process.    ServiceName

cmd खोलें, और फिर इसे पहले मारने की कोशिश करें taskkill /fi "services eq ServiceName" /f

यदि सब ठीक है, तो F5इसे डिबग करने के लिए पर्याप्त होना चाहिए।


0

में OnStartविधि, निम्न कार्य करें।

protected override void OnStart(string[] args)
{
    try
    {
        RequestAdditionalTime(600000);
        System.Diagnostics.Debugger.Launch(); // Put breakpoint here.

        .... Your code
    }
    catch (Exception ex)
    {
        .... Your exception code
    }
}

फिर प्रशासक के रूप में कमांड प्रॉम्प्ट चलाएं और निम्नलिखित में डालें:

c:\> sc create test-xyzService binPath= <ProjectPath>\bin\debug\service.exe type= own start= demand

उपरोक्त सूची सेवा सूची में परीक्षण-xyzService बनाएगी।

सेवा शुरू करने के लिए, यह आपको विजुअल स्टूडियो में डेब्यू करने के लिए संलग्न करेगा या नहीं।

c:\> sc start text-xyzService

सेवा को रोकने के लिए:

c:\> sc stop test-xyzService

हटाने या अनइंस्टॉल करने के लिए:

c:\> sc delete text-xyzService

0

Http पर एक Windows सेवा को डीबग करें (वीएस 2015 अपडेट 3 और .नेट एफडब्ल्यू 4.6 के साथ परीक्षण किया गया)

सबसे पहले, आपको अपने VS समाधान (Add -> New Project -> Console Application) के भीतर एक कंसोल प्रोजेक्ट बनाना होगा।

नए प्रोजेक्ट के भीतर, उस कोड के साथ एक क्लास "कंसोलहॉस्ट" बनाएं:

class ConsoleHost : IDisposable
{
    public static Uri BaseAddress = new Uri(http://localhost:8161/MyService/mex);
    private ServiceHost host;

    public void Start(Uri baseAddress)
    {
        if (host != null) return;

        host = new ServiceHost(typeof(MyService), baseAddress ?? BaseAddress);

        //binding
        var binding = new BasicHttpBinding()
        {
            Name = "MyService",
            MessageEncoding = WSMessageEncoding.Text,
            TextEncoding = Encoding.UTF8,
            MaxBufferPoolSize = 2147483647,
            MaxBufferSize = 2147483647,
            MaxReceivedMessageSize = 2147483647
        };

        host.Description.Endpoints.Clear();
        host.AddServiceEndpoint(typeof(IMyService), binding, baseAddress ?? BaseAddress);

        // Enable metadata publishing.
        var smb = new ServiceMetadataBehavior
        {
            HttpGetEnabled = true,
            MetadataExporter = { PolicyVersion = PolicyVersion.Policy15 },
        };

        host.Description.Behaviors.Add(smb);

        var defaultBehaviour = host.Description.Behaviors.OfType<ServiceDebugBehavior>().FirstOrDefault();
        if (defaultBehaviour != null)
        {
            defaultBehaviour.IncludeExceptionDetailInFaults = true;
        }

        host.Open();
    }

    public void Stop()
    {
        if (host == null)
            return;

        host.Close();
        host = null;
    }

    public void Dispose()
    {
        this.Stop();
    }
}

और यह Program.cs वर्ग के लिए कोड है:

public static class Program
{
    [STAThread]
    public static void Main(string[] args)
    {
        var baseAddress = new Uri(http://localhost:8161/MyService);
        var host = new ConsoleHost();
        host.Start(null);
        Console.WriteLine("The service is ready at {0}", baseAddress);
        Console.WriteLine("Press <Enter> to stop the service.");
        Console.ReadLine();
        host.Stop();
    }
}

कंसोल प्रोजेक्ट के App.config फ़ाइल में कनेक्शन जैसे कॉन्फ़िगरेशन कॉपी किए जाने चाहिए।

कंसोल को स्थिर करने के लिए, कंसोल प्रोजेक्ट पर क्लिक करें और डीबग पर क्लिक करें -> नया उदाहरण प्रारंभ करें।


0

बस अपने सेवा वर्ग में एक अवरोधक जोड़ें (यदि आपके पास यह पहले से नहीं है)। नीचे, आप जांच कर सकते हैं और दृश्य मूल .net के लिए उदाहरण दे सकते हैं।

Public Sub New()
   OnStart(Nothing) 
End Sub

उसके बाद, प्रोजेक्ट पर राइट-क्लिक करें और " डीबग -> एक नया उदाहरण प्रारंभ करें " चुनें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.