최근 프로젝트는 "DB2에 직접 액세스하는 WinForm"에서 "PHP 웹 서비스를 통해 DB2에 액세스하는 WinForm"으로 포팅되었습니다.
(PHP는 Linux에서 실행될 수 있고 Linux는 무료라는 장점이 있습니다.)
이 제안의 어려움은 DB2에 액세스하는 것이 아니라 .NET에서 PHP의 웹 서비스를 호출하는 것입니다. 오랫동안 .NET을 사용해 왔고, 항상 .NET만이 웹 서비스를 할 수 있다고 생각해온 저에게는 이것이 정말 조금 어려운 일입니다.
하지만 문제는 아직 해결해야 하고 마감 기한이 코앞으로 다가왔습니다. 몇 가지 조사 끝에 마침내 단서를 얻었고 이제 이를 여러분과 공유합니다.
우선 PHP 서버에는 WSDL 파일과 PHP 파일이라는 두 가지 이상의 파일이 필요합니다. WSDL 파일은 WebService에서 제공하는 서비스 및 호출 방법을 설명하는 데 사용되는 기계 판독 가능한 XML 파일입니다(.NET의 경우 호출 코드가 자동으로 생성되므로 사용하기가 매우 쉽습니다). 웹 서비스.
1) PHP 서버측 코드
1-1) TestWebService.php 코드
인용된 내용은 다음과 같습니다.
class TestWebService
{
공용 함수 HelloWorld()
{
return array("HelloWorldResult"=>"Hello");
}
공용 함수 GetArray( $ args) {
/*
문이 선언될 때 웹 서비스 메서드는 하나 이상의 매개 변수라는 점에 유의하세요.
(매우 혼란스럽습니다. 이 메소드를 호출하면 시스템이 모든 매개변수를 객체에 넣고 이를 전달한다는 것입니다.) value1 = $args->value1
//The 반환 값도 매우 특별합니다. $arry를 직접 반환하는 대신 객체에 넣어 반환합니다.
return array("GetArrayResult"=>$arry);
}
//WebSevice 인스턴스 만들기
$server = new SoapServer("TestWebService.wsdl" ) ;
$server->setClass("TestWebService");
$server->handle();
1-2) TestWebService.wsdl 코드
인용된 내용은 다음과 같습니다.
& lt;/s : element & gt;
& lt; s : 요소 이름 = "getArrayReSponse"& gt;
& lt; s : complextype & gt; & lt; s:element minOccurs="0" maxOccurs="1" name="GetArrayResult" type="tns:ArrayOfString" />
< ;/wsdl:message>
wsdl:message>
< wsdl:service name="TestWebService">
WSDL 코드는 메소드가 많을 경우 손으로 코드를 입력하는 것이 불가능합니다. .NET을 사용하여 실제 메서드 본문 없이 웹 서비스를 구현한 다음 http://***/TestWebService.asmx?를 사용하는 영리한 방법이 있습니다. wsdl 메소드는 wsdl 코드 파일을 생성합니다.
WSDL 파일과 관련하여 두 가지 특별한 점을 설명하고 싶습니다.
(1) Soap:address 노드는 WebService가 선언된 주소이며, 반드시 다음 노드로 변경되어야 합니다.
(2) 1차원 배열의 선언된 유형은 ArrayOfType이고, 문자열 배열의 선언된 유형은 ArrayOfString입니다. Type이 단순 타입이 아닌 경우 Type을 별도로 선언해야 합니다.
2) .NET 클라이언트 코드
먼저 웹 참조를 추가합니다. 주소는 WSDL 파일의 HTTP 주소입니다.
호출 코드(C#)
인용 내용은 다음과 같습니다.
> ;
요약: (1) PHP 약한 유형의 언어이므로 오류를 확인하기가 어렵습니다. 배열 유형도 일반적으로 이해되는 배열과 다릅니다. 또한 Hashtable과 유사한 사용법을 갖습니다.
(2) PHP 웹 서비스 메소드는 실제로 호출될 때의 매개변수와 반환값이 모두 패키징되어 객체에 전송되기 때문에 최대 1개의 매개변수와 반환값을 가질 수 있습니다.
(3) PHP 웹 서비스는 사용자 정의 유형 및 사용자 정의 유형 배열과 같은 복합 유형도 지원하지만 다중 배열은 지원하지 않습니다.