2009-12-09 4 views
2

IIS 또는 콘솔 응용 프로그램에서 호출 할 수있는 함수가 포함 된 어셈블리가 있습니다. 때문에 내가 경로를 얻기 위해 다음과 같은 선택 하셨을이의다른 파일을 bin 디렉토리에 두는 것은 좋지 않습니다.

:

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) 

분명이 함수의 경우 bin 디렉토리를 반환은 IIS에서 호출된다.

이 경로에 txt 파일을 만들려고합니다. bin 디렉토리에 텍스트 파일을 저장하는 것은 좋지 않은 생각입니까? 이것이 문제를 일으킬 수있는 이유가 있다면 유효한 이의 제기를하십시오.

답변

5

Assembly.Location은 예기치 않은 결과를 반환 할 수 있습니다. (예를 들어, NUnit을 통해 실행 중일 때) 또는 로컬 파일 시스템에 있지 않은 위치에서 실행 중일 때 (HTTP를 통해 .NET 애플리케이션을 실행할 수 있음).

AppDomain.CurrentDomain.BaseDirectory은 그림자 복사 전에 원래 경로를 반환하므로 더 안전한 옵션입니다 (HTTP 배포의 경우에는 ieexec.exe이있는 디렉토리를 반환한다고 생각합니다).

가장 안전한 옵션은 어셈블리에 리소스로 필요한 데이터를 포함하고 런타임시 Assembly.GetManifestResourceStream을 사용하여 리소스에 액세스하는 것이 가장 안전합니다.

2

이 디렉터리에 쓸 수있는 권한이 없을 수도 있습니다. 대신 TEMP 폴더를 사용해보세요 (Path.GetTempPath()).

+0

이제 사용 권한 테스트 ... –

+0

이상적으로는 System.IO.Path.GetTempPath() 속성을 사용하십시오. –

+0

사실이게 좋은 제안인데, 내가 좋아하지 않는 것은 temp 디렉터리가 모호한 위치에 있으며 외부 세력 (예 : 관리자와 같은)을 대상으로합니다. –

2

"bin"디렉토리에서 파일을 삭제/복사/덮어 쓰면 IIS가 프로세스를 다시 시작합니다. IIS는 응용 프로그램이 변경된 것으로 생각하기 때문에 "새로운"응용 프로그램으로 새 요청을 진행해야합니다.

이렇게, 그것은 나쁜 생각입니다.

+0

사실상 모든 파일을 변경하면 IIS 재설정? –

+0

그냥 DLL과 web.config에 대한 변경 일 뿐이라고 생각했습니다. –

+0

어셈블리를 확장하거나 확장 할 수 없거나 파일이 어셈블리가 아니지만 응용 프로그램의 일부가 될 수 있기 때문에 IIS가 다시 설정되는 파일이 있습니다. – TcKs

1

팀 로빈슨이 올바른 생각을 가지고 있습니다.

내가 말할 수있는 유일한 다른 점은 ASP.NET이 파일을 쓰는 경우 스레딩 코드에주의해야한다는 것입니다. 같은 페이지에 대해 두 번 요청하면 같은 파일을 동시에 작성하려고하므로 파일에 대한 쓰기를 잠그도록주의하십시오.

관련 문제