現在、電子メールキューサービスとして機能するWindowsサービスでホストされるMSMQWCFサービスを作成しました。アイデアは、複数の同時クライアントからアクセスできるすべてのクライアントアプリケーションが、1つの集中型の信頼できるキューイングシステムに電子メールを送信できるということです。電子メールが送信されると、サービスはキュー内のジョブ(カスタム電子メールオブジェクト)を処理して送信します。
私たちが直面している問題は、ServiceHostを実際に開くコードの部分がサンドボックス化されているように見え、サービスコードがイベントログに書き込んだり、カスタムログファイル(NLogによって管理されている)に書き込んだりできないことです。ここでの奇妙な点は、コードにファイルシステム上のファイルを別の場所に移動する機能もあることです。これは正しく機能しますが、前述のように、イベントログやログファイルに書き込むことはできません。AppDomain.UnhandledExceptionハンドラーが設定されているため、スローされたように見える例外もありません。
Windowsサービスの「実行」アカウントをローカルサービスからドメイン管理者、ランダムユーザーに数回変更しようとしましたが、何も機能していないようです。実際の「ServiceHost.Open()」呼び出しの前に、イベントログとカスタムログファイルに正常に書き込むことができることを証明できます。問題が発生しているのは、ServiceHostによってホストされている実際のクラス内だけです。
パーミッションだと思いたいのですが、前述のようにファイルを移動できるので、控えめに言っても矛盾しているようです。ホストされている環境はWindowsServer2003 R2 x64であり、.NET4.0を使用しています。
**注意として、レジストリ/カスタムログコードを削除し、(.NET SMTPクライアントオブジェクトを介して)電子メールの送信機能を使用するだけで、電子メールは正しく送信されます。
Snippet 1-WCFサービスコード自体。レジストリに書き込もうとしますが、これは機能せず、明らかに例外をスローしません。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, IncludeExceptionDetailInFaults = true)]
public class EmailQueueListener : IEmailQueuingService
{
[OperationBehavior(TransactionScopeRequired = false, TransactionAutoComplete = true)]
public void SendEmailToQueue(SerializableMailMessage emailMessage)
{
var eventLogSrc = "Email Service";
var eventLogLogType = "[APP NAME HERE]";
if (!EventLog.SourceExists(eventLogSrc))
EventLog.CreateEventSource(eventLogSrc, eventLogLogType);
EventLog.WriteEntry(eventLogSrc, "TESTING", EventLogEntryType.Information);
スニペット2-WindowsサービスのOnStartメソッドから呼び出されるサービスホストを開始するコード:
public static void Start(bool isConsole = false)
{
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
ConsoleLog.Info("TEST");
var eventLogSrc = "Email Service";
var eventLogLogType = "[APP NAME HERE]";
if (!EventLog.SourceExists(eventLogSrc))
EventLog.CreateEventSource(eventLogSrc, eventLogLogType);
EventLog.WriteEntry(eventLogSrc, "Email Service Started", EventLogEntryType.Information);
m_EmailServiceHost = new ServiceHost(typeof(EmailQueueListener));
m_EmailServiceHost.Open();
}