AjaxControlToolkit for .NET 4.0 버전을 여기저기 사용 중이다.


그런데, 최근 업데이트인 2013년 12월 14일(15일)자 버전이 좀 이상하다.


이전에 DropShadowExtender가 특정 페이지에서 정상 동작하지 않는 경우에 대해 글을 올린 적이 있는데

이번에는 AjaxFileUpload가 문제였다.


크롬이나 Internet Explorer 11에서는 아주 정상적으로 멀쩡히 잘 동작하는데

IE10 이하 버전에서는 업로드를 하다 말고 안되고 500 에러를 내고 죽는 것이 아닌가!


Event code: 3005 

Event message: 처리되지 않은 예외가 발생했습니다. 

Event time: 2014-02-06 오후 8:18:55 

Event time (UTC): 2014-02-06 오전 11:18:55 

Event ID: cded9fd12a594c5295865790e83d1f72 

Event sequence: 6628 

Event occurrence: 3 

Event detail code: 0 

 

Application information: 

    Application domain: /LM/W3SVC/1/ROOT-7-130361526421643606 

    Trust level: Full 

    Application Virtual Path: / 

    Application Path: D:\***\ 

    Machine name: *************

 

Process information: 

    Process ID: 4448 

    Process name: w3wp.exe 

    Account name: IIS APPPOOL\***********.Web 

 

Exception information: 

    Exception type: DirectoryNotFoundException 

    Exception message: 'C:\Windows\TEMP\_AjaxFileUpload\784171AD-D66C-6D54-AD42-8E3CEAFC24B4' 경로의 일부를 찾을 수 없습니다.

   위치: System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)

   위치: System.IO.FileSystemEnumerableIterator`1.CommonInit()

   위치: System.IO.FileSystemEnumerableIterator`1..ctor(String path, String originalUserPath, String searchPattern, SearchOption searchOption, SearchResultHandler`1 resultHandler, Boolean checkHost)

   위치: System.IO.Directory.InternalGetFileDirectoryNames(String path, String userPathOriginal, String searchPattern, Boolean includeFiles, Boolean includeDirs, SearchOption searchOption, Boolean checkHost)

   위치: System.IO.Directory.InternalGetFiles(String path, String searchPattern, SearchOption searchOption)

   위치: AjaxControlToolkit.AjaxFileUpload.XhrDone(String fileId)

   위치: AjaxControlToolkit.AjaxFileUpload.OnPreRender(EventArgs e)

   위치: System.Web.UI.Control.PreRenderRecursiveInternal()

   위치: System.Web.UI.Control.PreRenderRecursiveInternal()

   위치: System.Web.UI.Control.PreRenderRecursiveInternal()

   위치: System.Web.UI.Control.PreRenderRecursiveInternal()

   위치: System.Web.UI.Control.PreRenderRecursiveInternal()

   위치: System.Web.UI.Control.PreRenderRecursiveInternal()

   위치: System.Web.UI.Control.PreRenderRecursiveInternal()

   위치: System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)


 

 

Request information: 

    Request URL: http://www.******.***/*****/******Detail.aspx?contextKey={DA8BEDC8-B952-4d5d-8CC2-59FE922E2923}&done=1&guid=784171AD-D66C-6D54-AD42-8E3CEAFC24B4 

    Request path: /*****/******Detail.aspx 

    User host address: .***.**.*** 

    User: ********* 

    Is authenticated: True 

    Authentication Type: Forms 

    Thread account name: IIS APPPOOL\***********.Web 

 

Thread information: 

    Thread ID: 6 

    Thread account name: IIS APPPOOL\***********.Web 

    Is impersonating: False 

    Stack trace:    위치: System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)

   위치: System.IO.FileSystemEnumerableIterator`1.CommonInit()

   위치: System.IO.FileSystemEnumerableIterator`1..ctor(String path, String originalUserPath, String searchPattern, SearchOption searchOption, SearchResultHandler`1 resultHandler, Boolean checkHost)

   위치: System.IO.Directory.InternalGetFileDirectoryNames(String path, String userPathOriginal, String searchPattern, Boolean includeFiles, Boolean includeDirs, SearchOption searchOption, Boolean checkHost)

   위치: System.IO.Directory.InternalGetFiles(String path, String searchPattern, SearchOption searchOption)

   위치: AjaxControlToolkit.AjaxFileUpload.XhrDone(String fileId)

   위치: AjaxControlToolkit.AjaxFileUpload.OnPreRender(EventArgs e)

   위치: System.Web.UI.Control.PreRenderRecursiveInternal()

   위치: System.Web.UI.Control.PreRenderRecursiveInternal()

   위치: System.Web.UI.Control.PreRenderRecursiveInternal()

   위치: System.Web.UI.Control.PreRenderRecursiveInternal()

   위치: System.Web.UI.Control.PreRenderRecursiveInternal()

   위치: System.Web.UI.Control.PreRenderRecursiveInternal()

   위치: System.Web.UI.Control.PreRenderRecursiveInternal()

   위치: System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)




아주 미치고 폴짝 뛸 노릇.


열심히 구글링을 해봐도 나오는 건 이미 알고 있는 것뿐, 그다지 내 문제와 관련 있을 만한 건 나오지 않고,

가장 많았던 건 IE10 이하에서는 Drag&Drop이 안된다는 당연한(?) 얘기를 문제랍시고 읊어대는 내용들만 잔뜩...;;;

(HTML5 Drag&Drop은 IE11부터 지원된다!)


그나마 (결론적으로) 가장 유용한 내용이 있는 페이지는 아래 정도.


>> 참고: https://ajaxcontroltoolkit.codeplex.com/workitem/27416



F12 눌러서 네트워크 트래픽을 떠 봐도

IE10이나 IE11이나 전혀 다르지 않은데 이상하게 IE10에서만 500 에러를 내고 죽는다.

(IE11에서 에뮬레이션 모드를 IE10으로 바꿔도 마찬가지로 에러.)

HTML5 Drag&Drop 지원 여부 말고 둘 사이에 무슨 다른 점이 또 있는 걸까...


정말 희한한 현상이 아닐 수 없다.

권한이 걸려 있는 페이지들이긴 하지만, 권한 문제라면 IE10에서만 안 될 이유가 없을 텐데...


혹시나 하고 크롬에서 F12 눌러서 네트워크 트래픽을 떠 보니 좀 다르다.

(크롬에서 보여주는 트래픽 로그는 보기 불편하고 영 짜증나긴 하지만 IE와는 좀 다른 맛이 있다.)


뭐가 다른지 자세히 보니, 중간에 "AjaxFileUploadHandler.axd"라는 경로로 뭔가 요청이 발생한 것이 보였다.

IE 트래픽 로그에는 안 찍힌 것이 크롬에서는 찍혔다라... 이게 굳이 크롬으로 한번 더 테스트해보는 이유다.

(IE는 명시적으로 사용자에 의해 발생한 요청들만 트래픽에 찍힌다. 오고 간 트래픽은 다 찍혀야지... 이건 좀 어이가 없긴 하다.)

뭔지는 잘 모르겠지만 이처럼 숨은 트래픽에 문제를 일으킨 범인이 있다는 건데...


결국, Fiddler 출동!

IE10일 때와 IE11일 때를 자세히 비교해 봤다.

그랬더니...


역시 AjaxFileUploadHandler.axd 경로로 요청이 발생할 때가 문제였다.

IE11에서는 정상적으로 요청되어 처리가 되는데,

IE10에서는 저 경로로 요청하다가 튕겨서 로그인 페이지로 Redirection 되는 것이 아닌가!

그래서 내부적으로 처리되어야 할 뭔가가 처리되지 못하고(아마도 임시 파일 저장?) 500 에러를 뱉어낸 것이었다.


그런데, 왜 IE11에서는 되는데 IE10에서만 안되는 것일까?

참 특이하고 짜증 나는 현상이다. 브라우저 버전에 따라 내부적으로 동작하는 방식이 다르다니.

(그래서 내가 만들어진 Toolkit이나 API, 솔루션 같은 걸 갖다 쓰는 걸 싫어한다. 문제가 없을 때는 참 편하지만

문제가 생겼다 하면 도대체 원인을 알 수가 없으니... 그저 한땀 한땀 맨 땅에서부터 내 손으로 다 만드는 것이 쵝오!)


아무튼, 결론은 다시 "권한" 문제였다.

IE11에서는 스크립트에서 인증된 사용자의 권한을 가지고 AjaxFileUploadHandler.axd 경로로 요청이 되는데

IE10에서는 인증된 사용자의 권한이 홀라당 날아가 버리고 익명으로 요청이 발생한 것이었다.



web.config에서 AjaxFileUploadHandler.axd 경로에 대한 익명 접근 허용. 끝.


    <location path="AjaxFileUploadHandler.axd">

        <system.web>

            <authorization>

                <allow users="*" />

            </authorization>

        </system.web>

    </location>


>> 참고: http://stackoverflow.com/questions/17051845/ajaxfileupload-error




제길...

이걸로 어제 오후부터 오늘 아침까지 홀라당 날렸다. 저녁밥도 거르고... 흐미 아까운 내 시간! ㅜ.ㅜ





Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]