전산이야기

홈택스 전자세금계산서 연동 기능을 제공해주는 업체의 API를 테스트 하기 위하여 제공된 DLL을 참조 시키고

테스트 코드를 작성한 후 컴파일을 시도 했으나 다음과 같은 오류가 발생 하였다.

 

참조된 어셈블리 "Popbill.dll"이(가) 현재 대상 프레임워크 ".NETFramework,Version=v4.0,Profile=Client"에 없는 "System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"에 종속되어 있기 때문에 참조된 어셈블리를 확인할 수 없습니다. 이 문제를 해결하려면 (1) 이 프로젝트의 대상 프레임워크를 변경하거나 (2) 프로젝트에서 참조된 어셈블리를 제거하십시오.

해결을 위하여 시행착오를 겪다가 인터넷을 통해서 원인을 찾았다.

프로젝트 속성 중 대상 프로임워크가 .NET Framework Client Profile 로 되어 있었기 때문 이었다. Client Profile은 사용자를 위한 런타임 이기 때문에 Visual Studio 에서 컴파일 시에 사용할 수가 없다고 한다.

대상 프레임워크를 .NET Framework 4 로 변경 하고 저장 후, 프로젝트를 다시 오픈 한 다음 컴파일 하니 정상적으로 되었다.

동일한 증상 있으신 분은 참조 하시기 바랍니다.

Comment +0

지난 글에 이어서 실제 C# 으로 SOAP API를 호출 해 보는 소스를 작성 해 보겠습니다.

일반적으로 웹 서비스 제공업체에서 제공해 주는 기술문서를 참고로 해서 사용되는 함수 및 자료형을 확인해야 합니다.
여기서는 용마에서 제공되는 문서를 바탕으로 작성 되었습니다.

또한 처리방법만을 남길 목적인 테스트용 코드 이므로, 예외 처리등은 하지 않았습니다.
실제 환경에서는 반드시 리턴값 확인 및 예외 처리를 해야 합니다.

(1) define

1. 해당하는 클래스가 정의된 Reference.cs의 namespace 및 Linq를 using에 추가 합니다.

using WindowsFormsApplication1.kr.co.yongmalogis.www;
using System.Xml.Linq;

2. 호출될 메소드를 가지고 있는 객체를 전역변수로 선언 합니다.

TestBPService testBPService;

3. 나중에 사용할 List를 전역변수로 생성 합니다.

List<Dictionary<string, string>> array = new List<Dictionary<string, string>>();

 

(2) 등록번호 추출

간단히 getEDINum() 메소드를 호출하면 string 으로 리턴 됩니다.

private void btngetEDINum_Click(object sender, EventArgs e)
{
    txtgetEDINum.Text = testBPService.getEDINum();
}

 

(3) 반품정보 등록

주어진 기술문서를 참조하여 Key, Value 쌍을 Dictonary에 추가하고, 이를 다시 List에 추가 합니다.

Dictionary<string, string> dic = new Dictionary<string, string>();

dic.Add("regno", txtgetEDINum.Text);
dic.Add("ymd", "20190624");
dic.Add("Cons", "XXXXXX");
dic.Add("Seq", "1");
dic.Add("Ordno", "");
dic.Add("Vencode", "");
dic.Add("Venname", "왕내과");
dic.Add("Zip1", "123");
dic.Add("Zip2", "45");
dic.Add("Addr1", "울릉도 동남쪽 뱃길따라 2백리");
dic.Add("Addr2", "");
dic.Add("Contact", "이사부");
dic.Add("Phone1", "011-123-4567");
dic.Add("Phone2", "");
dic.Add("Descry", "");
dic.Add("Itemcode", "");
dic.Add("Itemname", "");
dic.Add("Qty", "1");
dic.Add("Memo1", "");
dic.Add("Sname", "");
dic.Add("sphone", "");

array.Add(dic);

기술문서에 파라미터 데이터 타입이 XML 문자열로 되어 있어서, List 데이터 전체를 ediInsert() 메소드의 인자로 넘길 XML 문자열로 변환 합니다.

XElement xmlElements = new XElement("TEBLE", array.Select(i => new XElement("item",
                    i.Select(j => new XElement(j.Key, j.Value))
                    )));

실제 SOAP API를 호출 합니다. 

string result = testBPService.ediInsert(xmlElements.ToString());
MessageBox.Show(result);

나머지 반품 확정 및 삭제는 등록번호 추출과 유사한 형태라 생략 합니다.

 

이 글이 도움이 되셨으면 좋아요 눌러 주시거나 댓글을 남겨 주세요.

Comment +0

최근 사내 ERP에서 용마택배로 반품정보를 SOAP API 호출을 해야 할 일이 생겨서 이를 정리 합니다.

우선 Visual Studio 에서 새로운 프로젝트를 시작하고, 솔루션 탐색기에서 서비스참조 추가를 합니다.

하단의 『고급』 버튼을 눌러서 서비스 참조 설정 창이 뜨면 다시 『웹 참조 추가』 버튼을 누릅니다.

 

웹 참조 추가 창이 나타나면, 알려 준 asmx URL을 입력하고 우측의 작은 화살표를 클릭 하면
자동으로 제공되는 메소드 목록이 나타 납니다.
확인 후 『참조추가』 버튼을 누르면 해당 메소드를 호출 할 수 있는 프록시 클래스가 생성 됩니다.

 

위의 웹 참조 이름을 더블클릭 하면 개체 브라우저를 통해 제공되는 메소드와 데이터타입 등을 확인 할 수 있습니다.

실제 소스는 Reference.cs 라는 파일로 생성 됩니다.

다음 글에서는 실제 API 호출을 하는 소스를 c# 으로 작성 하도록 하겠습니다.

Comment +0

java에서 compile 할 경우, 한글을 제대로 인식 하지 못해서 다음과 같은 오류가 발생할 때가 있다.

$ javac HelloWorld.java                                                                                               
HelloWorld.java:4: error: unmappable character for encoding ASCII                                                     
        System.out.println("??????");                                                                                 
                            ^  


이럴 때는 다음과 같이 Charterset를 알려 주면 정상적으로 컴파일 된다.

export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8


또는 컴파일러 옵션을 이용 해도 된다.

javac HelloWorld.java -encoding UTF8


이 때 java 파일은 UTF8(without BOM) 형식 으로 저장되어 있어야 한다.

Comment +0

외부 업체에서 VB6 로 개발된 프로그램이 실행시 다음과 같은 오류가 발생 하면서

정상적으로 실행이 되지 않았다.

 

개발 업체에 문의 해보니 수정(업데이트)된 프로그램을 서버에서 내려받는 모듈 쪽에서 문제가

생긴것이라고 했다. 그러나 왜 오류가 발생하는 지는 알지 못했고 그래서 해결도 하지 못했다.

 

마냥 기다리고 있을 수는 없어서 구글링을 통해서 해결방법을 찾았다.

 

mscomctl.ocx 라는 VB6용 공용 컨트롤이 레지스트리에 등록이 제대로 되어 있지 않아서 발생한 것으로서

해당 ocx 파일(32비트 윈도우는 C:\windows\System32\, 64비트 경우 C:\windows\syswow64\ 폴더 내)을

regsvr32 를 이용해서 등록 하면 된다.

 

이후 다시 프로그램을 실행 하니 정상적으로 동작했다.

 

역시 구글신이 최고다...

Comment +0

1. npm 으로 body parser 설치


  > npm install body-parser --save


2. 모듈 요청 및 파싱 미들웨어의 사용

var bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({ extended: false }))


3. prase 라우터


app.post('/form', (req, res) => {
  res.send(req.body.subject);
}

Comment +0

<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- tistory -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8408010821151948"
     data-ad-slot="4306191966"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>

Comment +0

node.js 초보자를 위한 한글로 된 문서(사이트) 입니다.


www.nodebeginner.org



Comment +0

1. export 측


  (예) greeting.js


2. import 측


  (예) app.js


Comment +0

1. 서버 접속

$serverName = "서버명(또는 IP)";
$connectionInfo = array( "Database"=>"DB명", "UID"=>"로그인", "PWD"=>"암호");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

2. 쿼리 실행

$params = array(&$_GET['name']);
$tsql = "SELECT id, name FROM Items WHERE name LIKE '%' + ? + '%'";

$cursorType = array("Scrollable" => SQLSRV_CURSOR_KEYSET);
$result = sqlsrv_query($conn, $tsql, $params, $cursorType);

3. 데이터 패치

while( $row = sqlsrv_fetch_array( $result, SQLSRV_FETCH_ASSOC))
{
echo $row["id"] . " " . iconv("euc-kr","UTF-8", $row["name"]) . "<br />";
}

4. 자원 해제 및 연결 닫기

sqlsrv_free_stmt( $result );
sqlsrv_close( $conn);


php

Comment +0