Windows 서비스에서 Streamwriter가 작동하지 않는 이유는 무엇입니까?
-
08-07-2019 - |
문제
레코드가 텍스트 파일에 로그를 추가하는이 간단한 코드가 있습니다.
public static void RecordToFile(string filename, Log log)
{
TextWriter textWriter = new StreamWriter(Constants.APP_PATH +
"\\" + filename, true);
textWriter.WriteLine(log.ToString());
textWriter.Close();
}
이것은 Windows Forms 응용 프로그램에서 완벽하게 작동합니다. 그러나 사용 instsrv 및 srvany 속임수, 나는 이것을 Windows 서비스로 만들었다. 서비스는 정상으로 실행되고 데이터베이스에 액세스하고 쿼리를 수행 하며이 스트림 라이터를 제외하고는 모두를 수행합니다. 로그는 그대로 업데이트되지 않습니다. 왜 아이디어가 있습니까?
해결책
대부분의 서비스는 해당 디렉토리에 대한 액세스 권한이없는 사용자 자격 증명에 따라 실행 중입니다.
따라서 서비스의 속성 대화 상자를 확인하고 로그온 탭을 확인하여 로그인하는 내용을 확인하십시오.
다른 팁
가능한 이유 :
- constants.app_path가 매핑 된 드라이브를 가리키고 있습니다 - 서비스는 로그인 사용자와 동일한 환경에서 실행되지 않으므로 경로가 유효하지 않을 수 있습니다.
- 권한 - 서비스가 실행중인 사용자에 따라 Winforms 앱과 동일한 디렉토리 세트에 액세스 할 수 없습니다.
더 많은 정보가 없으면 누구나 도울 수있는 것이 많지 않습니다. 정확히 어떤 식 으로든 기능하지 않습니까? 예외를 얻습니까? 조용히 실패합니까?
몇 가지 팁 만 ...
1) 문자열 연결을 사용하여 파일 경로를 만들지 마십시오. 사용 System.IO.Path.Combine
대신에. 이와 같이:
TextWriter textWriter = new StreamWriter(
System.IO.Path.Combine(Constants.APP_PATH, filename), true);
2) 작가를 a using()
차단하다. 그렇게 :
using(TextWriter textWriter = new StreamWriter(
System.IO.Path.Combine(Constants.APP_PATH, filename), true))
{
textWriter.WriteLine(log.ToString());
}
3) 서비스가 사용중인 계정이 해당 디렉토리의 파일을 작성/덮어 쓰기에 액세스 할 수 있는지 확인하십시오. 종종 서비스 계정과 같은 서비스 계정 LOCAL_SYSTEM
또는 NETWORK_SERVICE
사용자 계정과 동일한 권한을 가지지 않을 것입니다. 이것은 왜 그것이 사용자로서 작동하지만 서비스로서 작동하지 않는지 설명 할 수 있습니다. 또한 APP_PATH 상수는 네트워크 공유에 대한 드라이브 매핑과 같이 사용자 특정 무언가를 가리킬 수 있습니다. 드라이브 매핑은 사용자를 파악하지 못하므로 문제가 될 수도 있습니다.
더 이상 정보가 없으면 귀하의 서비스가 실행중인 계정에 작성된 파일을 열 수있는 권한이 없다고 생각합니다.