ASP.NET UTF-8 상태에서 서울신용평가 실명 확인하기

ASP.NET에서는 보통 UTF-8 인코딩을 사용하여 작업하게 되지만,

서울신용평가 실명확인 서비스는 아직 UTF-8 인코딩을 지원하지 않는다.

이를 위해 EUC-KR로 만든 페이지를 통해 요청을 보내고 받는 편법을 사용할 수도 있다.

하지만 이것은 보통의 ASP.NET 사용과는 다르기때문에 마음에 들지 않는다.

이것은 다음과 같이 하여 문제를 처리할 수 있다.

또한 이 방법은 실명 확인 뿐 아니라 SMS 서비스와 같이 EUC-KR만 지원하는 각종 서비스를 이용하는 방법으로 사용할 수 있다.

<%@ Page Language="C#" ... %>
<%@ Import Namespace="System.Net" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="log4net" %>
<script runat="server">
// 로그
private static readonly ILog log = LogManager.GetLogger("Some.Web");
// 서울신용평가 실명확인 URL
private static readonly string SIREN24_URL = "https://name.siren24.com/servlet/name_check";
// 실명확인 요청하는 페이지
private static readonly string CHECK_URL = "http://some.com/check.aspx";
// 실명확인 결과 페이지
private static readonly string CHECK_RESULT = "http://some.com/check_result.aspx";
/// <summary>
/// 실명 확인하기 버튼 클릭
/// </summary>
void Submit_ServerClick(object sender, EventArgs e) {
    StringBuilder sb = new StringBuilder());
    sb.Append("id=SOMEID&");
    sb.Append("name=").Append(Name.Value).Append("&");
    sb.Append("jumin1=").Append(Jumin1.Value).Append("&");
    sb.Append("jumin2=").Append(Jumin2.Value).Append("&");
    sb.Append("ok_url=").Append(CHECK_RESULT);
    string result = CheckSiren24(SIREN24_URL, sb.ToString(), CHECK_URL);
    if(result == null) {
        // Error
    }
    ...
}
/// <summary>
/// 서울신용평가 실명확인
/// </summary>
///
/// <param name="url">서울신용평가 실명확인 URL</param>
/// <param name="parameters">매개변수</param>
/// <param name="referer">실명확인 URL을 요청하는 URL 정보</param>
///
/// <returns>실명확인 결과를 문자열로 반환한다. 실패하면 null</returns>
string CheckSiren24(string url, string parameters, string referer) {
    try {
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
        req.Referer = referer;
        req.Method = WebRequestMethods.Http.Post;
        req.ContentType = "application/x-www-form-urlencoded";
        byte[] data = ToEucKr(parameters);
        req.ContentLength = data.Length;
        Stream stream = req.GetRequestStream();
        stream.Write(data, 0, data.Length);
        stream.Close();

        WebResponse res = req.GetResponse();
        StreamReader reader = new StreamReader(res.GetResponseStream(),
            Encoding.GetEncoding("EUC-KR")
        );
        string result = reader.ReadToEnd();
        reader.Close();
        return result;
    } catch(Exception ex) {
        log.Error("Exception=" + ex);
    }
    return null;
}
/// <summary>
/// 유니코드 문자열을 EUC-KR 인코딩 변환
/// </summary>
///
/// <param name="source">변환할 유니코드 문자열</param>
///
/// <returns>EUC-KR 인코딩된 바이트 배열</returns>
byte[] ToEucKr(string source) {
    byte[] b = Encoding.Unicode.GetBytes(source);
    return Encoding.Convert(Encoding.Unicode, Encoding.GetEncoding("EUC-KR"), b);
}
</script>
...
<form runat="server">
성명: <input type="text" id="Name" runat="server" ... /><br/>
주민번호: <input type="text" id="Jumin1" runat="server" .../>
<input type="text" id="Jumin2" runat="server" .../><br/>
<asp:ImageButton ID="BtnCheckJumin" OnClick="Submit_ServerClick" runat="server" ../>
</form>

서울 신용평가 실명 확인 결과는 다음과 같이 HTML로 되어있다.

<html>
<head>
<script language="JavaScript">
	function redirect(form)
	{
		form.submit();
	}
</script>
</head>
<body onLoad="JavaScript:redirect(document.target);">
	<form name=target method=post action="http://some.com/check_result.aspx">
		<input type=hidden name=jumin1 value="111111">
		<input type=hidden name=jumin2 value="1111111">
		<input type=hidden name=name value="홍길동">
		<input type=hidden name=result value="1">
	</form>
</body>
</html>

따라서 결과 문자열 중에 위의 굵게 표시된 result 값을 꺼내어 상태를 확인한다.