성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>한국투자증권 KIS Developers OpenAPI - GW라우팅 중 오류가 발생했습니다.</h1> <p> <a target='tab' href='https://www.sysnet.pe.kr/2/0/13498'>C#으로 KIS OpenAPI를 사용</a>하면 API 종류에 따라 "GW라우팅 중 오류가 발생했습니다."라는 오류가 나옵니다. 딱히 호출상 특이점 없이 이런 식으로 호출을 한 것뿐인데요,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > string url = "/uapi/domestic-stock/v1/trading/order-cash"; var response = await client.PostAsJsonAsync(url, query); </pre> <br /> 이때의 Request/Response 내용을 보면 다음과 같습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [요청] Method: POST, RequestUri: 'https://openapi.koreainvestment.com:9443/uapi/domestic-stock/v1/trading/order-cash', Version: 1.1, Content: System.Net.Http.Json.JsonContent, Headers: { Accept: application/json Authorization: Bearer e...[생략]...Q appkey: P...[생략]...m appsecret: q...[생략]...= tr_id: TTTC0802U custtype: P <span style='color: blue; font-weight: bold'>Transfer-Encoding: chunked</span> Content-Type: application/json; charset=utf-8 } {"CANO":"...[생략]...","ACNT_PRDT_CD":"...[생략]...","PDNO":"305720","ORD_DVSN":"00","ORD_QTY":"1","ORD_UNPR":"16005"} [응답] Response: StatusCode: 500, ReasonPhrase: 'Internal Server Error', Version: 1.1, Content: System.Net.Http.HttpConnectionResponseContent, Headers: { ...[생략]... Connection: close Content-Length: 88 Content-Type: application/json } {"rt_cd":"1","msg_cd":"EGW00202","msg1":"GW라우팅 중 오류가 발생했습니다."} </pre> <br /> 이전 글에도 설명했듯이 <a target='tab' href='https://www.sysnet.pe.kr/2/0/13522#post_async'>HttpClient의 PostAsJsonAsync 메서드를 PostAsync로 풀어낼 수 있습니다.</a><br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > HttpContent content = JsonContent.Create(query); var response = await client.PostAsync(url, content); </pre> <br /> 당연히! 위와 같은 코드도 "GW라우팅 중 오류가 발생했습니다." 오류를 보게 됩니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 위의 문제는 StringContent를 사용해 전달하면 해결됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > string bodyContents = JsonSerializer.Serialize(query); HttpContent content = new StringContent(bodyContents, Encoding.UTF8, "application/json"); var response = await client.PostAsync(url, content); </pre> <br /> 또는, JsonConten로 받아 LoadIntoBufferAsync 메서드를 호출하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > var jsonContent = JsonContent.Create(query); await jsonContent.LoadIntoBufferAsync(); var response = await client.PostAsync(url, jsonContent); </pre> <br /> 이렇게 되면, 정상적으로 주문 처리가 되는데 이때의 요청을 가로채면 다음과 같은 내용을 확인할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Method: POST, RequestUri: 'https://openapi.koreainvestment.com:9443/uapi/domestic-stock/v1/trading/order-cash', Version: 1.1, Content: System.Net.Http.StringContent, Headers: { Accept: application/json Authorization: Bearer e...[생략]...Q appkey: P...[생략]...m appsecret: q...[생략]...= tr_id: TTTC0802U custtype: P Content-Type: application/json; charset=utf-8 <span style='color: blue; font-weight: bold'>Content-Length: 104</span> } {"CANO":"...[생략]...","ACNT_PRDT_CD":"...[생략]...","PDNO":"305720","ORD_DVSN":"00","ORD_QTY":"1","ORD_UNPR":"16005"} </pre> <br /> 바뀐 점이 있다면, 오류가 발생했을 때의 패킷은 "Transfer-Encoding: chunked"를 포함했지만, 정상 처리된 경우에는 "Content-Length: 104"로 대체된 것뿐입니다. 그러니까, 지난 글은 바로 저 오류 때문에 정리한 것입니다. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C# - HttpClient.PostAsJsonAsync 호출 시 "Transfer-Encoding: chunked" 대신 "Content-Length" 헤더 처리 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/13522'>https://www.sysnet.pe.kr/2/0/13522</a> </pre> <br /> <hr style='width: 50%' /><br /> <br /> 기존의 "/oauth2/tokenP"와 "/oauth2/Approval" 요청 시에는 PostAsJsonAsync 요청이 정상적으로 되었기 때문에 처음 위의 오류를 보게 되었을 때는 ^^; 뭔가 한국투자증권 측에서 장애를 일으키고 있는 시간인가... 라고 생각하기도 했습니다.<br /> <br /> 암튼, <a target='tab' href='https://www.sysnet.pe.kr/2/0/13521'>WebSocket에서의 Ping/Pong 처리도 그렇고</a>... 그다지 깔끔하게 테스트된 것은 아닌 듯합니다.<br /> </p><br /> <br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
7579
(왼쪽의 숫자를 입력해야 합니다.)