본문 바로가기

C#(ASP.NET)

'Sys'이(가) 정의되지 않았습니다.


개발서버에서 정상적으로 되던 기능들이 실서버에 올라갔을 경우 아래 그림과 같이 에러가 나는 경우가 간혹 있다.
모든 브라우저 환경에서 발생하는 것도 아니고, 게릴라처럼 이곳저곳에서 발생되니...
게다가 보통 서버를 이중화 하는데.. 로드밸런싱을 하는 경우에만 발생하니 완전 미치고 팔짝 뛸 노릇이다.


이런 에러는 WebResource.axd, ScriptResource.axd 파일을 요청할 때 발생한다고 하는데..
(http://inaekkuya.blog.me/70090690083 의 글을 조금 간략히 정리한다. --;;)

WebResource.axd는 ASP.NET 2.0 에서 기본적으로 제공하는 HttpHandler로서 Custom Control의 DLL 내에 embeded resource로서 제공되는 .gif, .js, .htm 등을 반환하기 위해 추가된 기능이다.
WebResource.axd가 리소스가 포함된 DLL과 리소스의 ID를 query string에 포함시키고 이것을 암호화 하는데 기본 암호화 알고리즘이 (AES)Rijindael 알고리즘이다.

이 알고리즘은 ASP.NET의 기본설정을 암호화/복호화에 사용하는 키를 자동생성한다.
이때, 암호화 할 때 사용한 키와 복호화 할 때 사용한 키값이 다른 경우 예외가 발생한다.

- /WebResource.axd?d=~  랜더링 할 때 사용한 (자동 생성된)암호화 키와 실제 이 URL이 요청되었을 때의 (자동 생성된) 복호화 키가 다를 경우
- 웹 페이지 접속 시 ASP.NET 컨트롤에서 없던 오류가 날 경우
- 이미지가 엑박이 표시

이 경우 Fiddler를 통해 페이지 요청시 WebResource.axd 요청이 실패하는 지를 확인한다. 해당 요청 시 문제가 있다면 서버의 이벤트 로그에는 CryptographicException 오류가 발생하였는지 확인해보는 것이 좋다.

이 에러는 WebResource.axd 파일을 요청할 때 발생한다.
이 파일은 ASP.NET의 컨트롤을 사용하는 경우 요청되는데, 이때 암호화 작업이 발생한다.
암호화에 사용되는 Machine Key는 서버가 가지고 있는데, ASP.NET에서 MachineKey를 설정한 적이 없다면 동적으로 생성되어 사용된다.

서버가 한대일 경우는 상관 없으나, 여러대이면서 LoadBalancing을 하는 경우에는 문제가 발생한다.
즉, 요청 서버가 바뀌므로 암호화 키를 전달해준 서버가 아닌 다른 서버가 암호화된 정보를 받는다면 해독할 수 없으므로, 오류가 발생하는 것이다. 

이에 대한 해결 방법은????

모든 웹 어플리케이션 서버의 Machine Key를 동일하게 함으로 해결할 수 있다.
Machine Key 생성은
사이트에서 하면 되고, 생성된 Key는 Web.Config에 다음의 형태로 삽입하면 된다.

<system.web>
~
<machineKey validationKey="BF2B489FEAC7F5151427EF2CEB6F8A82AE38E58438C91EDA672E069D7911CEC8475EA0C970A34DF37F11BB9AF2DB6CFD6BDFE34D42757952C5870C1CBF259F57" decryptionKey="CDB14216ED22F4B85284FA58F795A0326FEBB4973844E8FCD75C07ED7E92D942" validation="SHA1" decryption="AES" />
~

</system.web>

ps. MacingKey 요소(ASP.NET 설정 스키마)
http://msdn.microsoft.com/ko-kr/library/w8h3skw9.aspx


여러번 경험했음에도 해결 방법을 몰라 고민을 했었던 것인데, 속 시원히 해결되서 다행!!!!!

[출처] http://dalzzang.tistory.com/69