php pear로 닷넷서버와 SOAP통신하기.

익명 사용자의 이미지

얼마전 c#을 이용해 닷넷으로 SOAP 서버를 맡기고,
php 의 pear SOAP으로 클라이언트를 만들어 통신을 하였으나

pear SOAP에서 생성하는 xml코드를 닷넷서버가
받아들이지 않아 정상적인 호출이 이루어지지않았습니다.

따라가다보니 function name에 해당하는 테그의 namespace 표현방식의 문제였고, 아래사항을 패치하였습니다.

pear SOAP의 버젼은 0.8.1 입니다.

--- Base.php.orig 2005-05-16 17:21:54.589970712 +0900
+++ Base.php 2005-05-16 17:25:21.484517960 +0900
@@ -524,10 +524,12 @@
// add namespaces
if ($elNamespace) {
$elPrefix = $this->_getNamespacePrefix($elNamespace);
- $xmlout_name = "$elPrefix:$name";
+ //$xmlout_name = "$elPrefix:$name";
+ $xmlout_name = "$name xmlns=\"$elNamespace\"";
} else {
$xmlout_name = $name;
}
+ $xmlout_name_close = $name;

if ($typeNamespace) {
$typePrefix = $this->_getNamespacePrefix($typeNamespace);
@@ -557,14 +559,14 @@
$xml = "\r\n<$xmlout_name$xmlout_type$xmlns$xmlout_arrayType$xml_attr/>";
} else {
$xml = "\r\n<$xmlout_name$xmlout_type$xmlns$xmlout_arrayType$xmlout_offset$xml_attr>".
- $xmlout_value."</$xmlout_name>";
+ $xmlout_value."</$xmlout_name_close>";
}
} else {
if (is_null($xmlout_value)) {
$xml = "\r\n<$xmlout_name$xmlns$xml_attr/>";
} else {
$xml = "\r\n<$xmlout_name$xmlns$xml_attr>".
- $xmlout_value."</$xmlout_name>";
+ $xmlout_value."</$xmlout_name_close>";
}
}
return $xml;

내용을 간략하게 설명하자면

pear에서 생성하는 xml은

<namespace:function>
<arg1> </arg1>
</namespace:function>

위의 방식으로 생성하게 됩니다만,

닷넷서버가 알아들을라면

<function xmlns="namespace">
<arg1> </arg1>
</function>

위와 같이 해야합니다.

또다른 SOAP 툴킷인 gSOAP과도 비교를 해보았는데
gSOAP서버의 경우 pear의 <ns:function> 방식도 이해하고
<function xmlns=ns> 방식도 이해를 하고,
gSOAP 클라이언트의 경우 닷넷처럼 <function xmlns=ns> 형식으로
xml문서를 만듭니다.

soap에 대한 지식이 얕아 뭐가 표준에 부합하는것인지 잘 모르고, pear에 패치한 내용이 올바른 접근 방식인지 역시 모르겠습니다.

일단 저렇게 하니 닷넷서버와의 통신은 성공을 하였고, 값도 잘 받아옵니다.

이 패치의 다른 영향에 대해서는 전혀 테스트 하지 않았습니다.
혹시 이 글을 참조하실 경우 충분한 테스트를 통해 적용하시길 권장드립니다.

Forums: 
ddoman의 이미지

손님으로 쓰여졌군요.
윗글은 제가 썼습니다.

원인이 로긴을 하고, 글 쓰기 버튼을 누른 후 에디트를 하다가, 딴일이 있어서 일을 보다가 몇시간 후 제출버튼을 눌렀는데

그 사이 세션 타임아웃이 나서 전에 로긴한게 취소되고
손님으로 전송되는듯 하네요..다음에는 주의해야할듯 싶네요. :)

gyumee의 이미지

제가 SOAP 표준 규약은 잘 모르겠지만 몇일 전에 간단하게 시험한 결과로는 apache의 AXIS와 잘 되더군요. 다만 제 경우는 axis를 사용한 쪽이 서버였고 PEAR::SOAP를 사용한 쪽이 서버였습니다.
UTF-8 인코딩을 사용한 한글 전달도 문제 없었습니다. 예전에 apache의 XML-RPC와 PHP의 XML-RPC는 한글이 잘 안되어서 apache의 XML-RPC를 수정해줘야 했었는데 AXIS는 문제 없더군요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.