본문 바로가기
  • 읽고보고쓰고
PROGRAMMING/ASP.Net

ServerXMLHTTP 로 데이터 전송

by 체리그루브 2009. 12. 18.
728x90

배경

B2B 로 데이터 교환 시 ServerXMLHTTP는 SSL 통신으로 자주 등장한다. 즉, 상대 업체가 https:// 로 호출해 주길 원하면, ServerXMLHTTP 사용이 불가피 하다는 것이다.

몇 줄 안되는 이 핵심 코드가 인터넷에서는 많은 데, 내 소스에서는 정확히 동작하지 않아, 많은 에러를 냈다. 나 또한 XMLHTTP 방식으로는 그간 별 무리 없이 수행해 왔었지만, 최근 몇 일 동안은 이 보안통신 방법에 막혀 고심해 왔었다. 계속해서 501 Status 만 되돌려 받았으니 말이다.

문제의 해결 과정은 의외로 간단했다. StatusText 라는 메소드를 사용하여 에러의 정확한 메세지를 파악하는 것이었다. 에러 메세지는 다음과 같았다.

 

"Method post is not defined in RFC 2068 and is not supported by the Servlet API."

 

위의 문장은 매우 명확하게 현재의 에러를 집어주고 있었다. 왜 진작에 이 에러 메시지를 찾을 생각을 못했을까 후회가 밀려왔다. 황급히 저 메시지를 갖고 구글링을 했다. 친절하게도 나와 같은 고민을 한 사람이 위의 에러를 찾아주었다. 바로 대소문자 구분!

 

.open "Post", strURL, false  --> .open "POST", strURL, false

  

소스

ASP로 개발했으며, 일부 각색하여 활용했던 소스를 옮겨본다.

 

Dim strOrgXML, strDocXML, strURL, strXML, strStatus, strStatusText, strString, strFileName,

Dim objDispatch, strResXML

 

strFileName = request.QueryString("filename")

strURL = https://상대업체주소?filename& strFileName
 

set strDocXML = createobject("msxml2.DOMDocument")

strDocXML.load "D:\" & strFileName

  set strXml=createobject("MSXML2.ServerXMLHTTP")

  with strXml
      '.SetOption(2)= 13056  ' Ignore all SSL errors
      .SetOption(3)= "LOCAL_MACHINE\My\<Certificate Name>"
      .open "POST", strURL, false

      .setRequestHeader "Content-Type", "text/xml"
      .setRequestHeader "Content", "text/html;charset=ISO-8859-1(UTF-8)"
      .send strDocXML
      strStatus = .Status
      strStatusText = .StatusText
   End With

   if strStatus = 200 then

      strDocXML.loadXML strXML.responseText
      strDocXML.async = true
      strDocXML.resolveExternals = false
      strDocXML.validateOnParse = false
      strDocXML.save Server.MapPath("xml/xmlSample.xml")
      strDocXML.load Server.MapPath("xml/xmlSample.xml")
      response.ContentType = "text/xml"
      strDocXML.save response

   else
      response.write "There is following Error<br>"
      response.write "Message No : " & strStatus & "<br>"
      response.write strStatusText
   end if

 

set strXml = nothing
set strDocXML = nothing

 

잡담

위의 소스는 실전에서는 .net Application으로 수정하여 작동하도록 할 것이다. 다만 위의 소스는 그 과정 속에서 테스트하는 web app 일 뿐이다. 이제 지루한 테스트는 끝난 것 같다. 갑자기 마음이 가벼워진다. 다른 이들에게도 이와 같은 해방감이 이루어 지길 기도한다.

728x90

댓글