2009-05-07 10 views
1

私は、テキストファイルにログを追加記録し、この単純なコードがあります。WindowsサービスでStreamWriterが動作しないのはなぜですか?

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 and srvanyトリックを使用して、私はこれをWindowsサービスにしました。サービスは正常に実行され、データベースにアクセスし、クエリやすべてを実行します...このStreamWriterを除きます。ログは更新されません。なぜどんなアイデア?

+2

どのように動作しませんか?それは例外をスローしますか?もしそうなら、いつ、そして何の例外? –

+1

なぜC#でWindowsサービスプロジェクトを作成するのではなく、instsrvとsrvanyを使用するのですか?どのキャストでも、他のコメント作成者が示唆しているように、解決する権限の問題がある可能性があります。 –

答えて

6

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

サービスのプロパティダイアログを確認し、[ログオン]タブをチェックしてログオンの内容を確認します。

+0

何が起きているのかを知る最良の方法は、サービスログにWindowsイベントログの例外を記録させることです。 – NotMe

+0

これは、サービスにそれを行う権限がない場合を除いて、私はそれも起こるのを見ました。 –

+1

私はプロセスモニタを使用してファイル権利の問題をデバッグするのが好きです。これは、IISやサービスの問題で過去に何時間も節約できました。プロセスごとにすべてのファイルアクセスを監視することができ、使用されたパスとともにアクセスが失敗した場合はその旨が表示されます。これは以前はsysinternalsツールでしたが、今はMicrosoftのサイトにあります。こちらをご覧ください:http://technet.microsoft.com/en-us/sysinternals/bb896645aspx – JMarsch

2

考えられる原因:

  1. Constants.APP_PATHがマップされたドライブを指している - サービスは、ログインしたユーザーと同じ環境で実行していないので、パスが有効
  2. 権限のではないかもしれません - サービスが実行されているユーザによっては、WinFormsアプリケーションと同じ一連のディレクトリにアクセスできない可能性があります。
1

これ以上の情報がなければ誰も助けることはできません。どのようにして、まさにそれは機能しませんか?例外はありますか?それは静かに失敗するだけですか?ヒントの

だけのカップル...

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

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

2)書き込み者をusing()ブロックで囲みます。ように:

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

+0

チップのおかげで。私はまだ問題を解決しようとしています – karlipoppins

0

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

関連する問題