1

レコードがテキストファイルにログを追加するこの単純なコードがあります。

    public static void RecordToFile(string filename, Log log)
    {
            TextWriter textWriter = new StreamWriter(Constants.APP_PATH + 
                "\\" + filename, true);
            textWriter.WriteLine(log.ToString());
            textWriter.Close();
    }

これは、Windowsフォームアプリケーションで完全に機能します。ただし、instsrvとsrvanyのトリックを使用して、これをWindowsサービスにしました。サービスは正常に実行され、データベースにアクセスし、クエリを実行します...このStreamWriterを除きます。ログが正しく更新されないだけです。なぜ何かアイデアはありますか?

4

4 に答える 4

7

ほとんどの場合、サービスは、そのディレクトリへのアクセス権を持たないユーザー資格情報で実行されています。

そのため、サービスのプロパティ ダイアログをチェックし、[ログオン] タブをチェックして、何としてログオンしているかを確認します。

于 2009-05-07T15:18:33.410 に答える
2

考えられる理由:

  1. Constants.APP_PATH はマップされたドライブを指しています - ログインしているユーザーと同じ環境でサービスが実行されないため、パスが有効でない可能性があります
  2. アクセス許可 - サービスを実行しているユーザーによっては、WinForms アプリと同じ一連のディレクトリにアクセスできない場合があります。
于 2009-05-07T15:19:59.990 に答える
2

より多くの情報がなければ、誰も助けることができません。正確には、どのように機能しないのでしょうか。例外はありますか?静かに失敗するだけですか?

いくつかのヒント...

1) ファイル パスの作成に文字列連結を使用しないでください。System.IO.Path.Combine代わりに使用してください。このような:

TextWriter textWriter = new StreamWriter(
    System.IO.Path.Combine(Constants.APP_PATH, filename), true);

using()2) ライターをブロックで囲みます。そのようです:

using(TextWriter textWriter = new StreamWriter(
        System.IO.Path.Combine(Constants.APP_PATH, filename), true))
{
    textWriter.WriteLine(log.ToString());
}

3) サービスが使用しているアカウントに、そのディレクトリ内のファイルを作成/上書きするアクセス権があることを確認します。多くの場合、サービス アカウントはユーザー アカウントと同じアクセス許可を持っているLOCAL_SYSTEMNETWORK_SERVICE、持っていません。これは、サービスとしてではなくユーザーとして機能する理由を説明できます。APP_PATH 定数が、ネットワーク共有へのドライブ マッピングなど、ユーザー固有のものを指している可能性もあります。ドライブ マッピングはユーザーにまたがらないため、これも問題になる可能性があります。

于 2009-05-07T15:20:52.283 に答える
0

これ以上の情報がなければ、あなたのサービスが実行されているアカウントには、書き込みのためにファイルを開く権限がないと思います。

于 2009-05-07T15:21:14.043 に答える