ฉันจะแก้จุดบกพร่องของบริการ Windows ใน Visual Studio ได้อย่างไร


85

เป็นไปได้ไหมที่จะดีบักบริการของ Windows ใน Visual Studio

ฉันใช้รหัสเช่น

System.Diagnostics.Debugger.Break();

แต่มันให้ข้อผิดพลาดรหัสบางอย่างเช่น:

ฉันได้รับข้อผิดพลาดสองเหตุการณ์: eventID 4096 VsJITDebugger และ "บริการไม่ตอบสนองต่อคำขอเริ่มต้นหรือการควบคุมในเวลาที่เหมาะสม"

คำตอบ:


124

ใช้รหัสต่อไปนี้ในOnStartวิธีการบริการ:

System.Diagnostics.Debugger.Launch();

เลือกตัวเลือก Visual Studio จากข้อความป๊อปอัป

หมายเหตุ:หากต้องการใช้ในโหมด Debug เท่านั้น#if DEBUGสามารถใช้คำสั่งคอมไพเลอร์ได้ดังนี้ วิธีนี้จะป้องกันไม่ให้เกิดอุบัติเหตุหรือการดีบักในโหมดเผยแพร่บนเซิร์ฟเวอร์ที่ใช้งานจริง

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

9
อย่าลืมเรียกใช้ VS ในฐานะผู้ดูแลระบบ จากนั้นจะมีอยู่ในรายการ
Michael

1
ใครช่วยชี้แจงความหมายของข้อความป๊อปอัปได้บ้าง จะปรากฏเมื่อใด / อย่างไร
Mike

@ ไมค์ติดตั้งและเริ่มบริการก็จะปรากฏขึ้น
Harshit

@ ไมค์เป็นกล่องโต้ตอบของ Windows ที่ปรากฏขึ้นบนเดสก์ท็อปแบบโต้ตอบ (เข้าสู่ระบบ) และถามว่าคุณต้องการเลือกแอปเพื่อแก้ไขข้อบกพร่องของกระบวนการหรือไม่ หากคุณเลือก VS มันจะเปิดตัวดีบักเกอร์และแนบไปกับกระบวนการ
Chris Johnson

63

คุณยังสามารถลองสิ่งนี้

  1. สร้างบริการ Windows ของคุณและติดตั้งและเริ่ม ... นั่นคือบริการของ Windows จะต้องทำงานในระบบของคุณ
  2. ในขณะที่บริการของคุณกำลังทำงานให้ไปที่เมนูDebugคลิกที่Attach Process (หรือกระบวนการใน Visual Studio เก่า)
  3. ค้นหาบริการที่ทำงานอยู่จากนั้นตรวจสอบให้แน่ใจว่าได้เลือกกระบวนการแสดงจากผู้ใช้ทั้งหมดและแสดงกระบวนการในเซสชันทั้งหมดแล้วหากไม่เลือก

ใส่คำอธิบายภาพที่นี่

  1. คลิกปุ่มแนบ
  2. คลิกตกลง
  3. คลิกปิด
  4. กำหนดจุดพักไปยังตำแหน่งที่คุณต้องการและรอดำเนินการ จะทำการดีบักอัตโนมัติเมื่อใดก็ตามที่รหัสของคุณไปถึงจุดนั้น
  5. โปรดจำไว้ว่าให้วางเบรกพอยต์ไว้ในจุดที่เข้าถึงได้หากเป็นonStart () ให้หยุดและเริ่มบริการอีกครั้ง

(หลังจาก googling ฉันพบสิ่งนี้ใน "วิธีการดีบัก Windows Services ใน Visual Studio")


2
ไม่เห็นตัวเลือกนี้ใน VS2013 Update 5. :(
sandeep talabathula

1
แต่คุณต้องเรียกใช้ Vs-2017 ของคุณในฐานะผู้ดูแลระบบ
chozha rajan

1
ฉันลองสิ่งนี้แล้ว มันทำงานร่วมกับเบรกพอยต์ใน onStop แต่ไม่ได้อยู่ใน onStart เนื่องจากเมื่อบริการหยุดการดีบักเกอร์จะไม่ได้เชื่อมต่อ
KansaiRobot

22

คุณควรแยกโค้ดทั้งหมดที่จะทำสิ่งต่างๆจากโปรเจ็กต์บริการออกเป็นโปรเจ็กต์แยกต่างหากจากนั้นสร้างแอปพลิเคชันทดสอบที่คุณสามารถรันและดีบักได้ตามปกติ

โครงการบริการจะเป็นเพียงเปลือกที่จำเป็นในการใช้งานส่วนบริการของมัน


โอ๊ว !! ctrl + C แล้ว ctrl + V ฉันหมายถึงโปรเจ็กต์ใหม่ ยาที่มีเพียงฉันเท่านั้นที่ทำ เป็นไปไม่ได้ที่จะแนบกระบวนการใด ๆ เพื่อแก้ไขข้อบกพร่องหรือตัวเลือกอื่น ๆ แทนที่จะเป็นโครงการแยกต่างหาก
PawanS

1
แน่นอนว่าเป็นไปได้ แต่การพัฒนาบริการ windows จะง่ายกว่ามากหากคุณนำส่วนบริการออกไประหว่างการพัฒนา
Lasse V.Karlsen

อืม ... นั่นเป็นวิธีที่ดี แต่มันเพิ่มงานเป็นสองเท่า ฉันคิดว่าจะมีทางอื่น
PawanS

9
ฉันไม่เห็นว่ามันจะ "เพิ่ม" งานได้อย่างไร แน่นอนว่ามันจะเพิ่มค่าใช้จ่ายเล็กน้อยในการสร้างโปรเจ็กต์พิเศษและแยกโค้ดในบริการออกเป็นโปรเจ็กต์ที่สาม แต่นอกเหนือจากนั้นคุณจะไม่ทำสำเนาโค้ดคุณจะย้ายมัน และอ้างอิงโครงการนั้น
Lasse V.Karlsen

3
^ + 1. เพิ่มงานเป็นสองเท่าในการจัดการบริการซึ่งค่อนข้างเป็นศูนย์ในแง่ของเวลาในการพัฒนาและคุณทำได้เพียงครั้งเดียว การดีบัก serice เป็นเรื่องที่น่าเจ็บปวด - ให้เริ่มต้นแบบคู่เป็นบรรทัดคำสั่ง ตรวจสอบ Google สำหรับคลาส Wrapper ที่กำหนดไว้ล่วงหน้าที่อนุญาตให้ทำสิ่งนี้ได้ (ใช้การสะท้อนเพื่อจำลองคลาสเริ่มต้น / หยุดที่ไม่มีบริการ) ทำงานหนึ่งชั่วโมงประหยัดได้มากมายขาดทุนสุทธิ: ลบ - คุณได้รับเวลา
TomTom

14

ไม่ว่าจะเป็นตามที่ Lasse V. Karlsen แนะนำหรือตั้งค่าลูปในบริการของคุณที่จะรอให้ดีบักเกอร์แนบ ง่ายที่สุดคือ

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

... continue with code

ด้วยวิธีนี้คุณสามารถเริ่มบริการและภายใน Visual Studio คุณเลือก "แนบกับกระบวนการ ... " และแนบไปกับบริการของคุณซึ่งจะกลับมาทำงานตามปกติ


ฉันควรใส่รหัสด้านบนไว้ที่ไหน ... และในขั้นตอนการแนบฉันได้รับบริการของฉันชื่อ disable
PawanS

3
เรายังใช้รหัสเช่นนี้ if (Environment.UserInteractive) { InteractiveRun(args); } else { Service instance = new Service(); ServiceBase[] servicesToRun = new ServiceBase[] { instance }; ServiceBase.Run(servicesToRun); }
Kirill Kovalenko

รหัสนั้นควรเร็วที่สุดเท่าที่จะเป็นไปได้ก่อนที่รหัสใด ๆ จะสามารถเรียกใช้ที่คุณต้องการแก้ไขข้อบกพร่อง
Pauli Østerø

@Pawan: ใน Start/ OnStart()ฉันเดา
abatishchev

@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ขณะที่หัวข้อบริการ faux กำลังทำงานอยู่จะไม่ยุติกระบวนการ


เนื่องจาก OnStart ควรจะกลับมาอย่างรวดเร็วคุณจึงไม่จำเป็นต้องทำในเธรดอื่น อย่างไรก็ตามหากบริการไม่เริ่มเธรดอื่นกระบวนการของคุณจะออกทันที
Matt Connolly

@MattConnolly ในส่วนหลัง: หากจำเป็นฉันเปลี่ยนรหัสด้านบนเพื่อเริ่มเธรดเบื้องหน้าที่หลับไปตลอดกาล (ก่อนการประมวลผลปกติ)
ta.speot.is

นี่น่าจะเป็นคำตอบที่แท้จริง ทำงานได้อย่างสวยงาม!
เข้าพรรษา

4

บทความของ Microsoft อธิบายวิธีการดีบักบริการ Windows ที่นี่และส่วนใดที่ทุกคนอาจพลาดหากพวกเขาดีบักโดยแนบกับกระบวนการ

ด้านล่างนี้คือรหัสการทำงานของฉัน ฉันทำตามแนวทางที่ 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();
}

ตอนนี้ไปที่Project Propertiesเลือกแท็บ "Application" และเลือกOutput Typeเป็น "Console Application" เมื่อทำการดีบักหรือ "Windows Application" เมื่อเสร็จสิ้นการดีบักคอมไพล์ใหม่และติดตั้งบริการของคุณ

ใส่คำอธิบายภาพที่นี่


1
มีวิธีตั้งค่าเอาต์พุตเป็น Console Application ใน Debug และ Window Application ในรีลีสหรือไม่
kofifus

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ชั้นเรียนของฉันเหมือนกับในแอปพลิเคชันบริการ Windows ของฉันServiceBaseทุกประการยกเว้นผู้รับมรดก ( )


อยู่ในโครงการเดียวกันหรือฉันเป็นโครงการอื่นสำหรับแอปคอนโซลนี้
PawanS

เป็นโครงการที่แตกต่างกัน 2 โครงการที่มีชั้นเรียนคล้ายกัน ในกรณีของฉันมันเป็นบริการง่ายๆที่มีเพียงคลาส ImportFileService เท่านั้นที่ซ้ำกัน เมื่อฉันต้องการ dev / test ฉันใช้ consoleapp แล้วคัดลอก / วาง เช่นเดียวกับที่ Lasse V.Karlsen กล่าวว่าเป็นโปรแกรมดีบักตรรกะทั้งหมด (ธุรกิจ) อยู่ในโครงการที่สาม
kerrubin

ใช่คือ ฉันจึงพูดว่า "ยกเว้นผู้รับมรดก ( ServiceBase)" ฉันพบว่าการดีบักในแอปคอนโซลนั้นง่ายกว่า แต่ฉันเข้าใจว่ามันไม่ได้ทำให้ทุกคนเชื่อ
kerrubin

3

ฉันใช้แพ็คเกจ Nuget ที่ยอดเยี่ยมชื่อว่า ServiceProcess.Helpers

และฉันอ้าง ...

ช่วยแก้ไขจุดบกพร่องของบริการ windows โดยการสร้าง UI เล่น / หยุด / หยุดชั่วคราวเมื่อทำงานโดยเชื่อมต่อกับดีบักเกอร์ แต่ยังอนุญาตให้ติดตั้งและเรียกใช้บริการโดยสภาพแวดล้อมเซิร์ฟเวอร์ Windows

ทั้งหมดนี้มีโค้ดเพียงบรรทัดเดียว

http://windowsservicehelper.codeplex.com/

เมื่อติดตั้งและต่อสายแล้วสิ่งที่คุณต้องทำคือตั้งค่าโปรเจ็กต์บริการ windows ของคุณเป็นโปรเจ็กต์เริ่มต้นและคลิกเริ่มบนดีบักเกอร์ของคุณ


ขอบคุณสำหรับการแบ่งปัน! มันเป็นวิธีแก้ปัญหาที่ง่ายที่สุด!
Wellington Zanelli

2

คุณยังสามารถลองSystem.Diagnostics.Debugger.Launch ()ใช้วิธีช่วยในการนำตัวชี้ดีบักเกอร์ไปยังตำแหน่งที่ระบุจากนั้นคุณสามารถดีบักโค้ดของคุณได้

ก่อนขั้นตอนนี้โปรดติดตั้ง service.exe ของคุณโดยใช้บรรทัดคำสั่งของ Visual Studio command prompt - installutil projectservice.exe

จากนั้นเริ่มบริการของคุณจากแผงควบคุม -> เครื่องมือการดูแลระบบ -> การจัดการคอมพิวเตอร์ -> บริการและแอปพลิเคชัน -> บริการ -> ชื่อบริการของคุณ


2

ฉันเพิ่งเพิ่มรหัสนี้ในคลาสบริการของฉันดังนั้นฉันจึงสามารถเรียก OnStart ทางอ้อมซึ่งคล้ายกับ OnStop

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

2

ฉันใช้/Consoleพารามิเตอร์ในการดีบักโครงการ Visual 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วิธีการ ฉันยังต้องการให้มันทำงานเป็นแอปพลิเคชันคอนโซลเพื่อให้ฉันสามารถบันทึกข้อมูลจากNLogไปยังคอนโซลได้

ฉันพบคำแนะนำที่ยอดเยี่ยมเหล่านี้ที่ทำสิ่งนี้:

เริ่มต้นด้วยการเปลี่ยนแปลงโครงการที่จะOutput typeConsole 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. แต่ฉันก็สร้างแอป Forms ให้ง่ายขึ้น ฉันเกลียดแอปคอนโซลมาก นอกจากนี้คุณสามารถใช้ปุ่มฟอร์มสำหรับแต่ละเหตุการณ์ของบริการได้อย่างง่ายดาย
Roland

1

ขออภัยหากคุณกำลังพยายามแก้ไขข้อบกพร่องบางอย่างในช่วงเริ่มต้นของการดำเนินการ Windows Service การ "แนบ" กับกระบวนการที่กำลังทำงานอยู่จะไม่ทำงาน ฉันลองใช้ Debugger.Break () ภายใน OnStart procecdure แต่ด้วยแอปพลิเคชันที่คอมไพล์ Visual Studio 2010 แบบ 64 บิตคำสั่ง break จะแสดงข้อผิดพลาดดังนี้:

System error 1067 has occurred.

เมื่อถึงจุดนั้นคุณต้องตั้งค่าตัวเลือก "Image File Execution" ในรีจิสทรีของคุณสำหรับปฏิบัติการของคุณ ใช้เวลาห้านาทีในการตั้งค่าและทำงานได้ดีมาก นี่คือบทความของ Microsoft ที่มีรายละเอียด:

วิธีการ: เปิดตัวดีบักเกอร์โดยอัตโนมัติ


1

ลอง Visual Studio ของตัวเองมากpost-build บรรทัดคำสั่งเหตุการณ์

ลองเพิ่มสิ่งนี้ในหลังการสร้าง:

@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ข้อความแสดงข้อผิดพลาดใน Notepad และดูที่ประโยคสุดท้ายของข้อความ

มันอาจจะพูด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

บรรทัดด้านบนจะสร้าง test-xyzService ในรายการบริการ

ในการเริ่มบริการนี้จะแจ้งให้คุณแนบเพื่อเปิดตัวใน Visual Studio หรือไม่

c:\> sc start text-xyzService

ในการหยุดบริการ:

c:\> sc stop test-xyzService

ในการลบหรือถอนการติดตั้ง:

c:\> sc delete text-xyzService

0

ดีบักบริการ Windows ผ่าน http (ทดสอบด้วย VS 2015 Update 3 และ. Net FW 4.6)

ประการแรกคุณต้องสร้างโครงการคอนโซลภายใน VS Solution ของคุณ (เพิ่ม -> โครงการใหม่ -> แอปพลิเคชันคอนโซล)

ภายในโปรเจ็กต์ใหม่สร้างคลาส "ConsoleHost" ด้วยรหัสนั้น:

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();
    }
}

ควรคัดลอกการกำหนดค่าเช่น connectionstrings ในไฟล์ App.config ของโครงการ Console

หากต้องการทำให้คอนโซลหยุดนิ่งให้คลิกขวาที่โครงการ Console แล้วคลิก Debug -> เริ่มอินสแตนซ์ใหม่


0

เพียงแค่เพิ่ม contructor ในคลาสบริการของคุณ (หากคุณยังไม่มี) ด้านล่างนี้คุณสามารถตรวจสอบและตัวอย่างสำหรับ Visual Basic. net

Public Sub New()
   OnStart(Nothing) 
End Sub

หลังจากนั้นคลิกขวาที่โปรเจ็กต์และเลือก " Debug -> Start a new instance "

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.