ASP.NET

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 값을 꺼내어 상태를 확인한다.

ASP.NET 2.0 지역화

ASP.NET 2.0 지역화 방안 중 한 개.

App_GlobalResources 디렉토리에 Resources1.resx, Resources1.ko.resx 리소스를 만든다.

리소스에는 Footer_PrivacyPolicy를 넣는다.

web.config 파엘에는 culture를 지정한다.

<system.web>

<globalization fileEncoding="utf-8" culture="ko-KR" uiCulture="ko-KR" />

</system.web>

페이지에서는 다음과 같이 사용한다.

<script runat="server">

void Page_Load(object sender, EventArgs e) {
System.Resources.ResourceManager resourceManager =
  new System.Resources.ResourceManager("Resources.PageText",
  System.Reflection.Assembly.Load("App_GlobalResources"));
Footer_PrivacyPolicy.Text = resourceManager.GetString("Footer_PrivacyPolicy");
}

</script>

...

<asp:Localize ID="Footer_PrivacyPolicy" runat="server" Text="Private Policy"></asp:Localize>

ViewState Mac 검사 오류

서버 폼을 포함한 ASP.NET 페이지에서 다른 페이지로 전송할 때가 있다.

form.aspx

<form id="sampleForm" runat="server" action="proc.aspx" method="post">

...

</form>

이와 같이 실행하게 되면 proc.aspx 페이지에서 다음과 같은 오류를 만나게 된다.

Server Error in ‘/’ Application.
Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey> configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Web.HttpException: Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey> configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.

아직은 .NET Framework를 많이 사용해보지 못해서 그런지 당황스러울 때가 있다.

단일 서버를 사용 중인데 이와 같은 오류 메시지는 더욱 그러하다.

이런 오류를 해결하기 위해서는 데이터를 받는 페이지에서는 ViewState Mac을 검사하지 않도록 해주면 된다.

proc.aspx

<%@Page Language="C#" EnableViewStateMac="true" %>

물론 web.config 파일에서 <pages enableViewStateMac=”false”/> 와 지정할 수도 있다.

자료