관리 메뉴


Kinesis´s Open Document

ASP.NET C# - Dynamic XML in IIS7 / iis7 환경에서 다이나믹(동적) XML 구성하기 본문

MEMO/기술 자료/C# Language

ASP.NET C# - Dynamic XML in IIS7 / iis7 환경에서 다이나믹(동적) XML 구성하기

Kinesis 2012. 8. 23. 17:54

XML 확장자 뒤에 쿼리스트링을 통해 값을 출력하는 모습을 담은 스크린샷

 

최근 XML 이나 JSON 등을 통해 비동기식 통신 특히 AJAX가 사용되기 시작하면서 Open API 이 등장하고 이를 통한 연계 시스템등의 구축등으로 흐름이 넘어가고 있다. 사실상 문서의 형식만 원하는 형태로 정상적으로 얻을 수 있다면 값을 받아오는 것은 문제가 되지 않는다.

 

그러나 문뜩 js 라던가 xml 을 확장자로 사용하는 상태에서 쿼리스트링 등을 통해 인자값을 전달하고 그에 따른 값을 받아올 수는 없을까? 하는 생각이 들었다. 물론, 작업하는 환경이 IIS7 및 ASP.NET C# 이다보니 그에 따른 세팅을 해봐야할 필요가 있을 것 같았다.

 

하지만, 나의 검색능력이 예전같지 않은건지... 단순히 검색만으로는 관련 내용이 "나 여기있소" 하고 바로 툭 튀어나오지는 않았다. 그렇다 하더라도 여기서 "나는 포기하겠소" 하고 물러날 수는 없는 법. 몇번의 시도 끝에 xml 의 확장자에 쿼리스트링을 통해 값을 전달하여 동적 XML 의 모양을 나타내는 것에 성공했다. (위의 스크린샷 참조)

 

물론, 사실상 XML 자체가 동적일 수는 없다. 단지 흉내내고 약간의 속임수 같은 방법을 통해 구현을 해 내는 것으로 서버측 연산을 통해 값을 나오는 페이지를 다른 URL 주소로 맵핑을 시켜주는 과정을 통해 원하는 결과를 얻어 낼 수 있는 것이다. 이 방법을 통하면 단순히 동적인 결과를 갖는 XML 뿐 아니라, JS 도 가능할 것이다.

 

결과적으로 방식은 이러하니 이용하기는 이용자 실력 및 센스 나름이라는 것이다.

 

혹여 이러한 방법이 필요한 사람도 있지 않을까 하여 메모겸 블로그에 글을 남긴다.

 

 

첫번째로 해당 작업을 할 웹 서비스 프로젝트가 필요하다. 예제로 보여주기 위해서 가장 단순하게 보여줄 수 있도록 빈 웹 서비스를 생성했다. 프로젝트의 이름은 "Dynamic XML in IIS7" 으로 명명했다. 

 

 

프로젝트 솔루션이 생성되고 나면 이제 쿼리스트링을 받아 연산을 하고 결과를 뽑아줄 ASPX 페이지를 생성할 차례다. 자신이 원하는 이름으로 문서를 생성한다. 나는 개인적으로 "dynamic_xml_001.aspx" 라는 이름으로 생성을 하였다. 

 

 

문서가 생성이되고 나면 F7 키를 눌러 서버측 연산을 담당하는 .cs 파일을 열어준다. 사실상 aspx 확장자에 있는 웹페이지는 아무런 작업도 내용도 하지 않을 것이다. aspx.cs 라는 서버측 스크립트에서 연산을 해서 보여주는 값 자체를 아예 새로 뿌려줄 것이기 때문이다.

 

 

서버에서 연산을 끝마치고 최종적으로 보여지는 페이지. 즉 Request(요청) 에 따른 Response(결과) 페이지는 aspx가 아닌 cs가 담당을 한다. 고로 우선 기본적으로 보여줄 결과 값을 지우고 새로운 헤더의 형식과 내용을 담을 필요가 있다. 따라서 헤더의 정보를 담을 수 있도록 다음의 코드가 Load 이벤트의 상단에 위치하게 된다.

Response.Clear();
Response.ContentType = "text/xml";
Response.Charset = "utf-8";
Response.Write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");

Clear() 는 결과값으로 보내기 위해 준비되었던 내용을 지우는 역할을 한다. 그리고 ContentType 은 반환할 컨텐츠의 형태를 의미한다. 우리의 목적은 xml 의 문서형태로 내보내는 것이기 대문에 "text/xml" 으로 지정하는 것이고 그 외의 줄은 딱히 설명할 필요가 없을 듯 하니 생략한다. 그리고 마지막에 값을 전송하는 푸터에 해당하는 내용을 작성해 준다.

Response.End();
Response.Flush();

그리고 실질적인 내용은 이 두 내용의 사이에 작성해주면 된다.

 

 

일단 테스트를 위해 기본적인 루트엘리먼트를 만들어주고, 인자값을 테스트하는 목적으로 1개의 쿼리스트링에 대해서만 값을 얻어와서 엘리먼트 아이템을 생성하도록 했다.

 

 

F5 키를 눌러 기본 문서의 형태를 확인해 보았다. XML 문서의 형태로 해서 루트엘리먼트만 존재하는것을 확인할 수 있었다.

 

 

이번에는 사전에 지정한 쿼리스트링 키에 값을 추가하여 페이지를 요청해보았다. 결과, 해당 쿼리스트링 키 값을 가지고 만들어진 엘리먼트 아이템이 생성, 추가된 것이 보여진다. 이제는 이 aspx 확장자를 가진 문서를 aspx 가 아닌 xml 의 형태로 꾸며(속여)줄 준비를 해야할 차례가 왔다.

 

 

어떻게 꾸며(속여)줄 것인가? 그 답은 Web.config 에 있다. Web.config 파일을 열어 <system.web></system.web> 안에 <urlMappings> 부분을 추가해야한다. 내용은 다음과 같다.

<urlMappings enabled="true"> 
    <add mappedUrl="~/XML/dynamic_xml_001.aspx" mappedUrl="~/XML/dynamic_xml_001.xml" />
</urlMappings>

mappedUrl 도 여러 개체에 통용되게끔 하고 싶었는데, 이 부분은 아직 확인을 못해서 1개씩 추가를 해야할 듯 싶지만, xml 등의 확장자로 많이 맵핑할 이유가 없다면 큰 문제는 되지 않을 것 같다. (여러개 파일을 한번에 매핑할 수 있는 방법을 알고 계신 분이 있으면 제보해주시면 매우 감사드릴 것 같다.)

 

그런데 이 url맵핑은 단순 리다이렉트가 아니다보니 그냥 요청을 하게 되면 정상적으로 결과값이 나오지가 않는다. 해당 확장자에 처리기까지 맵핑을 시켜줘야만 하는 것이다.

 

여기서 참고사항을 전달하자면, 일반적인 정적인 XML 을 담아둘 경로와 정적인 XML을 담아둘 경로를 다르게끔 해두라는 것이다. 해당 확장자에 처리기 맵핑을 했는데, 그 처리기 매핑이 가리키고 있는 경로에 정적인 순수한 XML이 있다면 오류를 띄우는 문제가 있기 때문이다. 이 점만 참고하면 본 방법을 유용하게 사용할 수 있으리라 생각한다.

 

다시 본론으로 돌아와서 이번에는 처리기를 맵핑할 차례다. 나는 XML 이라는 경로에 위치한 파일을 요구할때 동적 XML 문서를 내놓는 것으로 처리하기 위해 XML 이라는 경로를 포함시켰는데, 이를 처리하기 위해 처리기 매핑에 대상이 되는것 또한 XML/*.xml 이 된다.

 

이번에는 <system.web></system.web> 의 다음에 동일 레벨로 <system.webServer></system.webServer> 요소를 추가해야한다. 내용은 다음과 같다.

<system.webServer>
    <handlers>
        <!-- 32bit 환경 처리기 매핑 --><add name="xml_x86" path="xml/*.xml" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
        <!-- 64bit 환경 처리기 매핑 --><add name="xml_x64" path="xml/*.xml" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
    </handlers>
</system.webServer>

여기까지의 작업이 완료되었다면, 결과를 확인해보자.

 

XML 확장자 뒤에 쿼리스트링을 통해 값을 출력하는 모습을 담은 스크린샷

 

xml 의 확장자에 아까와 동일하게 쿼리스트링을 붙였고, 원하던 결과가 나오는 것을 확인했다.

 

이상 끝~

 

혹시 프로젝트 파일을 통해 확인해보고 싶은 사람을 위해 본 글을 작성하면서 만든 예제 소스를 첨부합니다.

 

Dynamic XML in IIS7.rar

 

 


Comments