비주얼 스튜디오 - Failed to register URL "http://localhost:6879/" for site "..." application "/". Error description: Access is denied. (0x80070005)
예전에 했던 프로젝트를 최근에 로드해서 F5 디버깅을 시도했더니, 다음과 같은 오류가 발생합니다.
Unable to launch the IIS Express Web server.
Output from IIS Express:
Failed to register URL "http://localhost:6879/" for site "WebApplication1" application "/". Error description: Access is denied. (0x80070005)
해당 포트로 등록하는데 실패했다는 것이 좀 이해가 안 되는군요. "localhost"이므로 별도의 urlacl 항목이 필요 없기 때문에 "Failed to register"가 발생할 이유는 없습니다. 게다가... 예전 글에서 설명했던 방법을 이용해 그 포트를 urlacl에 등록하기까지 했었습니다.
IIS Express - localhost 이외의 호스트 이름으로 접근하는 방법
; https://www.sysnet.pe.kr/2/0/1030
그래서 다음과 같은 설정이 있었는데도,
// netsh http add urlacl url=http://*:6879/ user="testuser"
Reserved URL : http://*:6879/
User: TESTPC\testuser
Listen: Yes
Delegate: No
SDDL: D:(A;;GX;;;S-1-5-21-531704745-1234150627-1213840556-1001)
오류가 발생한 것입니다.
재미있는 건 저 설정이 있었기 때문에 "Failed to register URL "http://localhost:6879/" 오류가 발생한다는 사실입니다. 따라서 저 항목을 삭제하면 이 문제가 해결됩니다.
netsh http delete urlacl ur=http://*:6879/
만약 urlacl 항목을 살리고 싶다면, "applicationhost.config" 파일을 수정하는 방법도 있습니다. 예를 들어, 비주얼 스튜디오가 디버깅 시에 실행한 iisexpress.exe의 명령행을 보면,
"C:\Program Files\IIS Express\iisexpress.exe" /config:"c:\temp\testdir\WebApplication1\.vs\WebApplication1\config\applicationhost.config" /site:"WebApplication1" /apppool:"Clr4IntegratedAppPool"
"c:\temp\testdir\WebApplication1\.vs\WebApplication1\config\applicationhost.config" 파일의 경로가 나오는데, 이 파일을 메모장으로 열어 다음의 항목을 찾아 "localhost" 바인딩을 삭제하면 됩니다.
// 변경 전
<site name="WebApplication1" id="2">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="c:\temp\testdir\WebApplication1\WebApplication1" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:6879:localhost" />
<binding protocol="https" bindingInformation="*:44308:localhost" />
</bindings>
</site>
// 변경 후
<site name="WebApplication1" id="2">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="c:\temp\testdir\WebApplication1\WebApplication1" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:6879:" />
<binding protocol="https" bindingInformation="*:44308:localhost" />
</bindings>
</site>
물론 위와 같이 바꾸면, 이제는 반드시 urlacl에 해당 포트의 항목이 등록되어 있어야 합니다.
참고로, 포트 바인딩 앞의 "*", "+" 접두사의 차이는 다음의 글에서 확인할 수 있습니다.
What's the difference between http://*:80 and http://+:80
; https://stackoverflow.com/questions/4598164/whats-the-difference-between-http-80-and-http-80
Difference between http://+:8080/ and http://*:8080/
; https://stackoverflow.com/questions/9459656/difference-between-http-8080-and-http-8080
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]