C#으로 작성된 웹 서비스를 Delphi에서 호출할 때 발생하는 문제에 대해
우선, 전자상거래 환경에서 등장한 초기 웹서비스의 발전 과정을 비교적 포괄적으로 설명할 필요가 있다고 생각합니다. 비즈니스 통신 및 데이터 교환의 경우 dcom 및 corba와 같은 바이너리 메커니즘을 사용하는 것은 더 이상 가능하지 않습니다. 예를 들어 dcom(공통 개체 모델 배포)에 의해 제한됩니다. Windows 플랫폼에서만 수행할 수 있지만 corba(공통 객체는 브로커를 요청함) 아키텍처)는 Java 플랫폼의 제품일뿐입니다. 애플리케이션 간의 데이터 통신을 달성하는 것은 어렵습니다.
이러한 맥락에서 시대의 요구에 따라 웹 서비스가 등장했습니다. 이는 언어 간, 플랫폼 간, 기업 방화벽에 대한 우수하고 안전한 침투를 위한 좋은 솔루션입니다. 아키텍처는 일반적으로 다섯 가지 수준으로 나뉩니다.
http(하이퍼텍스트 전송 프로토콜) 채널을 통한 데이터 통신
xml(확장 가능한 마크업 언어) 데이터 표현 형식
비누의 데이터 캡슐화(단순 객체 액세스 프로토콜)
wsdl의 설명 언어 형식(웹 서비스 설명 언어)
uddi(Universal Description and Discovery Integration) 통합 설명, 검색 및 통합
언어와 플랫폼을 넘나들며 회사 방화벽을 잘 통과하고 안전하게 침투한다는 점은 우리를 흥분시키기에 충분합니다. 그러나 다음과 같이 개선이 필요한 부분도 있습니다.
HTTP 데이터 통신이 느립니다. 특히 첫 번째 연결이 느립니다.
웹 서버의 추가 오버헤드 필요
웹 서비스의 아키텍처와 장점과 단점에 대해 이야기한 후, 이번에 논의할 주제인 요점으로 넘어가겠습니다.
Delphi에서 웹 서비스 서비스를 호출할 때 발생하는 문제
더 이상 고민하지 않고 webmethod의 속성을 테스트하는 간단한 예를 들어 설명하겠습니다. 이는 고객 a에서 고객 b로 전송을 완료하는 간단한 비즈니스 프로세스입니다.
먼저 .net Framework1.1에서 웹 서비스를 생성합니다. 이때 .net은 자동으로 웹 애플리케이션을 생성합니다.
attributetesting 네임스페이스 아래에 attributetest 클래스를 생성해야 합니다. 그런 다음 이 클래스는 자동으로 기본 클래스 system.web.services.webservice를 상속합니다. 필요한 경우 웹 애플리케이션 클래스 webserviceattribute를 설정할 수 있으며 기본 속성에는 설명이 포함됩니다. 및 네임스페이스
[웹서비스속성(네임스페이스=http://www.isdoo.com/services,
Description=안셀님, 안녕하세요. 이것은 테스트용 웹 서비스입니다!)]
공개 클래스 속성 테스트 : system.web.services.webservice
{
[webmethodattribute(description=설명 정보: count 메서드를 상속하고 이름을 오버로드합니다. 실행은 사용자 a에서 사용자 b로 돈을 이체하는 것입니다...,
//메시지 이름=메시지 이름 변경,
버퍼응답=true,
캐시 기간=1000,
활성화 세션=true,
transactionoption=transactionoption.requiresnew)]
공공문자열트랜스머니(더블머니)
{
노력하다
{
contextutil.enablecommit();//데이터베이스 작업에만 사용되는 트랜잭션입니다!
머니인토아(돈);
돈아웃(돈);
contextutil.setcomplete();
반환 거래 성공, 총계 +money.tostring();
}
잡기(예외 e)
{
contextutil.setabort();
반품 거래 실패! /n/r +e.message;
}
}
프라이빗 보이드 머니인토아(더블머니)
{
sqlcommand sqlcom = new sqlcommand(업데이트 예산 세트 돈=money++money.tostring()+ where name='a');
데이터베이스 액세스 mydatabase = 새 데이터베이스 액세스();
sqlcom.connection=mydatabase.getconnection();
sqlcom.connection.open();
sqlcom.executenonquery();
sqlcom.connection.close();
//새 예외 발생(돈을 이체할 때 작업이 실패했습니다!);
}
개인 무효 돈 outfromb(더블 머니)
{
sqlcommand sqlcom = new sqlcommand(업데이트 예산 세트 돈=money-+money.tostring()+ where name='b');
데이터베이스 액세스 mydatabase = 새 데이터베이스 액세스();
sqlcom.connection=mydatabase.getconnection();
sqlcom.connection.open();
sqlcom.executenonquery();
sqlcom.connection.close();
//새로운 예외 발생(b에서 돈을 이체할 때 작업이 실패했습니다!);
}
}
특히 주목해야 할 것은 webmethodattribute인데, 이번 이야기의 핵심이기도 합니다. 이 메소드를 클라이언트 세그먼트 호출자에게 공개합니다. 2개의 설명 정보 속성과 4개의 기능 속성을 포함하여 아래의 6개 속성에 대해 이야기하겠습니다.
설명 정보 속성:
설명
메시지 이름
4가지 기능적 특성:
버퍼응답
캐시 기간
활성화 세션
거래옵션
그 중 messagename 속성에 주의할 필요가 있는데, Delphi가 .net 플랫폼에서 개발된 웹서비스를 호출할 때 messagename 속성을 설정하면 클라이언트가 이를 호출할 때 오류가 보고됩니다. 이는 버그일 수 있으며 최신 버전에서 이 문제가 해결될 수도 있습니다. 이러한 속성의 특정 기능에 대해서는 여기에서 자세히 설명하지 않습니다. 관련 서적을 읽을 수 있습니다.
아래에는 Delphi가 웹 서비스를 호출하는 단계가 나열되어 있습니다.
우선 클라이언트를 개발하고 호출하는 경우 일반 애플리케이션만 생성하면 됩니다. 그런 다음 도구 모음 웹 서비스에서 비누httpclient 컨트롤을 찾아 클라이언트 애플리케이션 창 본문에 배치하면 됩니다. ;
둘째, 이 비누http클라이언트의 url 또는 wsdl 속성을 설정해야 합니다. 이 콘텐츠는 웹 서비스의 서비스 주소입니다.
예를 들어, 현재 예제의 서비스 주소는 http://localhost/attributetesting/attributetesting.asmx입니다.
wsdl을 입력하려면 http://localhost/attributetesting/attributetesting.asmx?wsdl입니다.
이것으로 제어 설정이 완료됩니다.
그런 다음 서버 측 wsdl을 가져와야 합니다. 수동으로 수행하거나 Delphi에서 제공하는 웹 서비스 가져오기 기능을 사용할 수 있습니다.
마지막으로 가져온 wsdl 인터페이스만 호출하면 됩니다. 여기에 해당하는 코드는 다음과 같습니다.
절차 tform1.bitbtn1click(발신자: tobject);
var
aa:attributetestsoap;//wsdl 아래의 클래스 인터페이스 개체입니다.
msg:와이드스트링;
bb:더블;
시작하다
//httprio2는 실제로 데이터 전송, 요청 보내기 및 응답 수락을 담당하는 소위 프록시 클래스입니다.
aa:=httprio2 속성으로testsoap;
bb:=100.00;
msg:=aa.transmoney(bb);//웹 서비스를 호출하여 우리에게 노출되는 웹 서비스 메서드 webmethod입니다.
쇼메시지(msg);
끝;
알았어! 그게 다야!
상용 소스코드 인기 다운로드 www.html.org.cn