2011-04-05 3 views
3

WSDL 가져 오기 도구를 사용하여 Delphi XE에서 웹 서비스를 만들었습니다. 델파이는 IT 트랜스미터 인터페이스와 GetITransmitter 함수를 사용하여 ITransmitter1.pas 모듈을 생성했습니다. Delphi 웹 서비스는 어떻게 작동합니까? (런타임에서 메소드 추가하기) ??

내가 사용하는 웹 서비스를 사용하려면 ...

var Transmitter: ITransmitter; 
begin 
    Transmitter := GetITransmitter(True, '', nil); 
    Transmitter.Transmit(Memo1.Text, OutXML); 
end; 

하지만 난이 방법 전송 어디서나 몸을 볼 수 없습니다 ITransmitter.pas에서

내가 볼 :

InvRegistry.RegisterInterface(TypeInfo(ITransmitter), 'urn:TransmitterIntf-ITransmitter', 'utf-8'); 
    InvRegistry.RegisterDefaultSOAPAction(TypeInfo(ITransmitter), 'urn:TransmitterIntf-ITransmitter#Transmit'); 

내가 언급하는 경우 이 라인은 "인터페이스 지원되지 않음"오류가 발생합니다. 여기에서 알 수 있듯이 델파이는 RunTime에 메서드를 추가하고 있습니다! 어떻게 작동합니까? 내 자신의 클래스에 런타임에 메서드를 추가 할 수 있습니까?

답변

2

WSDL 가져 오기 도구를 사용하여 웹 서비스 클라이언트를 만든 경우 생성 된 클라이언트 코드는 서버에서 메소드를 호출합니다. 따라서 'body'(코드) 메서드는 웹 서비스 서버에 있습니다.

델파이는 WSDL을 기반으로 SOAP 요청을 생성하며, 웹 서비스 호출의 매개 변수 등을 XML로 생성하는 데 RTTI (introspection)가 사용됩니다. 이 XML은 메소드 구현을 실행하고 Soap 응답을 되돌려 보내는 서버로 보내진다.

웹 서비스 서버를 만들면 상황이 달라집니다.이 경우 델파이 애플리케이션은 물론 모든 메소드 본문을 구현해야합니다.

+0

내 Transmitter.Transmit 메소드를 디버그 할 수 없습니다. 그리고 나는 여전히 어떤 메소드가 실제로 Transmitter.Transmit을 호출 할 때 실행되는 지 궁금해? 일반적으로 어떤 메서드를 호출하면 일부 .pas 파일에 코드가있는 것을 볼 수 있습니다. 이제는이 메서드를 호출 할 때 실제로 어떤 일이 발생하는지 전혀 모른다 ... – Astronavigator

1

실제로 메서드이 Interface에 정의되어 있고이 인터페이스는 System.pas에 선언 된 IInvokable에서 상속됩니다.

소스 코드를 확인하면 호출하는 IInvokable 인터페이스가 프로젝트의 로컬 객체에 구현되어 있지 않다는 것을 알 수 있습니다. 이는 해당 메소드가 서버에서 원격으로 실행되기 때문입니다.

그 전에 서버에 적절한 SOAP 요청을 작성하고 전송 한 다음 서버 응답을 기다리고 해석하는 데 사용되는 일부 파스칼 코드가 있으므로이 구현 세부 사항을 고려하십시오. 이것이 어떻게 작동하는지 좀 더 알고 싶다면 "debug .dcus 사용"컴파일러 옵션을 활성화하여 VCL/RTL 내부에서 디버깅 할 수 있습니다.

그런 다음 평소와 같이 TRIO.GenericStub 메소드의 일부 어셈블러에서 StepInto (F7) 명령을 사용하여 디버거가 Transmit 메소드를 단계별로 실행하도록 요청하십시오. 여기서 패킷은 준비되고 전송된다. btSOAP 들어

I는이 응답에 쓰기 위해 사용하고 결합

은 관련 부분은 Rio.pas 부에 라인 (943)에서 시작한다 :

try 
     FWebNode.Execute(Req, Resp); 
    finally 
     { Clear Outbound headers } 
     FHeadersOutBound.Clear; 
    end;   

THTTPReqResp.Execute 다음을 수행 Wininet.dll을 함수를 사용 연결, 서버를 사용하여 정보를 보내고 받으십시오.

당신이 깊이 갈 수있는 수준이 있습니다 ... 얼마나 멀리 가고 싶은지에 대한 관심과 세부 사항의 큰 금액은 여기에 내 대답의 범위를 훨씬 벗어납니다 ... 게시 자유롭게 관심있는 구체적인 질문이 많습니다.

자세한 내용은 잘 모르겠지만 델파이 버전간에 변경 될 수 있습니다 ... 지금 델파이 XE를 사용하고 있습니다.

+0

OK. 내가 뭘보고 : 송신기 개체 GetITTransmitter 함수에 의해 생성되었습니다. 이 함수는 다음과 같이 결과를 생성합니다 : RIO : = THTTPRIO.Create (nil); 결과 : = (IT 전송기로 RIO); 따라서 Transmit 메서드의 reallisation은 THTTPRIO 클래스에 있어야합니다. 그러나 내가 본 것처럼 하나도 없다. 그래서 저는 Transmitter의 어떤 메소드를 호출 할 때마다, 사실, TRIO.GenericStub가 실행될 것입니다. 그래서 나는이 미래에 내 자신의 수업을 만들 수 있습니까? 나는 그런 수업을 들었다. 그래서 어떤 방법으로 호출하든, 어쨌든 델파이는 고정 된 방법을 부를 것인가? – Astronavigator

+0

@Astronavigator : ITransmitter는 WDSL 가져 오기 프로그램에서 WDSL을 처리하는 동안 Delphi에서 생성되는 인터페이스입니다. 즉, 호출하는 인터페이스 메소드에 대해 Generic 메소드가 호출됩니다. 해당 메소드가 클라이언트 측에서 정의되는 실제 객체는 없습니다. 인터페이스는 사용자의 편의를 위해 정의되었으므로 애플리케이션의 다른 객체와 동일한 방식으로 웹 서비스와 상호 작용할 수 있습니다. THTTPRio/TRio 클래스는 AS 연산자가 인터페이스에 개체를 캐스팅하는 동안 호출되어 해당 매핑을 수행하기 위해 즉시 VTable을 생성하는 동안 호출되는 표준 QueryInterface 메서드를 사용합니다. – jachguate

+0

QueryInterface를 처리하는 동안 호출되는 TRio.GenVTable 메서드를 살펴보십시오. 단위는 soap \ Rio.pas입니다. – jachguate

관련 문제