문제

레코드가 텍스트 파일에 로그를 추가하는이 간단한 코드가 있습니다.

    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 서비스로 만들었다. 서비스는 정상으로 실행되고 데이터베이스에 액세스하고 쿼리를 수행 하며이 스트림 라이터를 제외하고는 모두를 수행합니다. 로그는 그대로 업데이트되지 않습니다. 왜 아이디어가 있습니까?

도움이 되었습니까?

해결책

대부분의 서비스는 해당 디렉토리에 대한 액세스 권한이없는 사용자 자격 증명에 따라 실행 중입니다.

따라서 서비스의 속성 대화 상자를 확인하고 로그온 탭을 확인하여 로그인하는 내용을 확인하십시오.

다른 팁

가능한 이유 :

  1. constants.app_path가 매핑 된 드라이브를 가리키고 있습니다 - 서비스는 로그인 사용자와 동일한 환경에서 실행되지 않으므로 경로가 유효하지 않을 수 있습니다.
  2. 권한 - 서비스가 실행중인 사용자에 따라 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 상수는 네트워크 공유에 대한 드라이브 매핑과 같이 사용자 특정 무언가를 가리킬 수 있습니다. 드라이브 매핑은 사용자를 파악하지 못하므로 문제가 될 수도 있습니다.

더 이상 정보가 없으면 귀하의 서비스가 실행중인 계정에 작성된 파일을 열 수있는 권한이 없다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top