كيفية التقاط إخراج وحدة التحكم من خدمة C#؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

لدينا خدمة C# يتم نشرها لنظام العملاء البعيد.يكتب التطبيق قدرًا كبيرًا من المعلومات "التشخيصية" إلى وحدة التحكم (أي.Console.WriteLine()).الخدمة ليست "تفعل ما ينبغي." كيف يمكننا التقاط إخراج وحدة التحكم من الخدمة في تطبيق آخر؟

إصدار WinForm يمكن تحميل التطبيق في موقع العميل.ولسوء الحظ، فإنه يعمل بشكل صحيح.

تحديث:

نحن قادرون على تغيير تغيير الخدمة، ولكننا نفضل عدم إجراء تغييرات كبيرة في هذا الوقت.

نقوم أيضًا بتسجيل الدخول إلى MSMQ، ولكن فقط للأحداث "المهمة".تتفاعل هذه الخدمة مع MSMQ لعملياتها العادية.أو على الأقل ينبغي ذلك.لا يبدو أن الخدمة تقوم بسحب العناصر من MSMQ عندما يقوم إصدار WinForm بذلك.لذلك، قد تكون كتابة الرسائل التي تنتقل إلى وحدة التحكم مشكلة.

هل كانت مفيدة؟

المحلول

هل أنت قادرة على تغيير رمز الخدمة <م> على الإطلاق ؟ إذا كان الأمر كذلك، وذلك باستخدام Console.SetOut الكتابة إلى ملف بدلا سيكون أول ميناء الأكثر وضوحا من المكالمة. ثم تغيير لاستخدام مكتبة قطع الأشجار المناسبة للإصدار التالي:)

نصائح أخرى

في عام، يجب تجنب كتابة معلومات التشخيص مباشرة إلى وحدة التحكم، سجل الأحداث، MSMQ أو في أي مكان آخر من التعليمات البرمجية للتطبيق الخاص بك. بدلا من ذلك استدعاء API قطع الأشجار، واستخدام التكوين لإعادة توجيه الإخراج حيثما تريد.

وعلى سبيل المثال، هل يمكن أن يحل محل جميع Console.WriteLine التي كتبها Trace.WriteLine (*). ثم يمكنك إعادة توجيه الإخراج إلى وحدة التحكم، ملف أو أي مكان آخر عن طريق تعديل ملف تكوين التطبيق: على سبيل المثال لإخراج إلى وحدة التحكم، واستخدام ConsoleTraceListener، شيء من هذا القبيل:

<configuration>
  <system.diagnostics>
    <trace autoflush="false" indentsize="4">
      <listeners>
        <add name="configConsoleListener"
             type="System.Diagnostics.ConsoleTraceListener" />
      </listeners>
    </trace>
  </system.diagnostics>
 </configuration>

وعلى الرغم التصحيح، ستحصل الإخراج الخاص بك على وحدة - على موقع العميل كنت تكوينه لإعادة توجيه إخراج التتبع إلى ملف، إلى سجل الأحداث أو ما شابه ذلك

وحتى أفضل، واستخدام إطار تسجيل 3rd الطرف (انصح Log4Net) والتي سوف تعطيك المزيد من الخيارات من System.Diagnostics.Trace.

و(*) Trace.Write / Trace.WriteLine هي نفس Debug.Write / Debug.WriteLine، إلا أن هذا الأخير يتم تجميع فقط إذا تم تعريف رمز DEBUG. لذلك تفضل تتبع لتصحيح إذا كنت تريد إخراج لتكون متوفرة في الإصدار يبني.

وكنت قد حصلت على مجموعة من الخيارات. إعادة توجيه وحدة الإخراج إلى ملف واستخدام مكتبة قطع الأشجار المناسبة كما ذكرنا هما الجيد منها. وهنا الخيار الأوسط: الكتابة إلى سجل الأحداث

EventLog log;
string logsource = "MyService";

// execute once per invocation
if (!System.Diagnostics.EventLog.SourceExists(logsource))
{
    System.Diagnostics.EventLog.CreateEventSource(
        logsource, "Application");
}
log = new EventLog();
log.Source = logsource;
log.Log = "Application";

// replace console logging with this
log.WriteEntry(message, EventLogEntryType.Information);

ثم ابحث عن إدخالات في سجل أحداث التطبيق (أدوات إدارية -> عارض الأحداث). حيث المصدر = "MyService"

وأنا لن تستخدم Console.WriteLine في كل من خدمة النافذة. ربما يجب عليك تسجيل هذه الأخطاء إلى ملف السجل.

وهناك طريقة أخرى للقيام بذلك بحيث تطبيقات متعددة يمكن أن تستهلك سجلات ونشر رسائل سجل إلى قائمة انتظار MSMQ.

واستخدام debug.writeline واستخدام sysinternals على debugview؟

ولقد وجدت هذا إضافة على MSDN الذي يربط إخراج وحدة التحكم إلى مربع النص الغني، عملت بالنسبة لي بسرعة وسهولة.

ووتجاوز للإشارة، ويمكن توسيعها لتجاوز أساليب أخرى.

إليك كيفية عرض إخراج وحدة التحكم لخدمة تعمل تحت نظام التشغيل Windows 7.قد يكون هذا مفيدًا إذا كنت غير قادر تمامًا على تعديل الكود المصدري للخدمة لتسجيل الدخول إلى ملف.

  1. قم بتشغيل Services.msc وقم بتحرير خصائص الخدمة.في علامة التبويب "تسجيل الدخول"، حدد "السماح للخدمة بالتفاعل مع سطح المكتب"

  2. استخدم محرر التسجيل لتعديل ImagePath لخدمتك:انتقل إلى HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\ [اسم الخدمة الخاصة بك] وقم بتحرير ImagePath.ألحق cmd.exe /c إلى بداية سلسلة ImagePath.لذلك إذا كان ImagePath الأصلي الخاص بك هو c:\myService\myservice.exe يجب أن يكون ImagePath الجديد الخاص بك cmd.exe /c c:\myService\myservice.exe.

  3. ابدأ خدمتك.يجب أن تحصل على نافذة منبثقة بعنوان "الكشف عن الخدمات التفاعلية".حدد "عرض الرسالة".يجب أن تقوم شاشتك بتبديل السياقات وعرض نافذة وحدة التحكم.عند الانتهاء، انقر فوق الزر "العودة الآن".

  4. عند الانتهاء من التصحيح، قم بتعديل ImagePath إلى قيمته الأصلية.ثم قم بإلغاء تحديد خانة الاختيار "السماح للخدمة بالتفاعل مع سطح المكتب" في خصائص الخدمة وأعد تشغيل الخدمة.

تحذير:لقد فعلت ذلك مع خدمة واحدة فقط وقد نجح الأمر بالنسبة لي.لا أعرف ما إذا كان هذا سيعمل مع أي خدمة أم أنه سيتسبب في أي نتائج غير متوقعة، لذا أقترح عليك بشدة أن تفعل ذلك فقط في بيئة غير إنتاجية.

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