2012-01-03 4 views
0

간단한 SOAP 응용 프로그램이 있습니다. 중간 계층 : TADOQuery에 연결된 TDatasetProvider를 포함한 TSOAPDataModule. TADOQuery는 몇 가지 매개 변수 (다른 데이터 유형)를 정의했습니다. 클라이언트 : TSOAPConnection에 연결된 TClientDataSet 및 MiddleTier의 DatasetProvider로 설정된 공급자.SOAP 응용 프로그램에서 쿼리 매개 변수 데이터 유형이 WideString으로 변경되었습니다.

디자인 타임에 필자는 서버에서 ClientDataSet의 매개 변수 및 필드를 가져올 수 있습니다. 런타임에 나는 programaticaly ClientDataSet에 대한 매개 변수를 설정하고 Open을 호출합니다. 하지만 매개 변수의 잘못된 값에 대한 SQL 오류 (중간 계층의 ADOQuery를 통해 SQL Server에서 클라이언트로 SOAP 전달)가 발생합니다. 세부 디버깅 후 클라이언트에서 SOAP 서버로 매개 변수가 올바르게 전달된다는 것을 알았습니다. Provider.Params는 모든 매개 변수를 올바르게 나열합니다. ADOQuery가 열리기 전에 불행히도 (ADOQuery.Parameters가 DataSetProvider에서 할당 된 후) 모든 매개 변수의 DataType이 변경됩니다. 즉 : 원래 ADOQuery 매개 변수 데이터 형식은 ftDateTime이지만 DataSetProvider에서 할당 한 후에는 ftWideString이됩니다.

클라이언트에서 null이 아닌 모든 매개 변수 데이터 유형에 대해 이러한 오류가 발생합니다.이 오류는 모두 ftWideString이됩니다.

이 변경은 TParam.Assign에서 TParameter (Destination) .Value가 TParameter (Destination) .DataType보다 먼저 할당 된 경우에 발생합니다. 값이 할당 된 후 DataType은 값의 varType에서 자동으로 추측됩니다. Value는 OleVariant에서 유래 되었기 때문에 항상 String으로 간주됩니다.

값 이전에 TParam.Assign 프로 시저 = Assign DataType을 변경하려고 시도했습니다. 그러나 이런 식으로 ADO Error Type 값이 DataType과 호환되지 않습니다.

그 문제는 매개 변수가 SOAP XML 요청으로 인코딩되는 방식에 있다고 생각합니다. 그 값은 형식 정보없이 '{value}'입니다.

나는이 문제에 대해 많이 봤지만봤을 때 simmillar 동작에 대한 메모조차 찾지 못했습니다.

잘못된 것이 있습니까? 아니면 델파이의 SOAP 버그입니까?

PS : 저는 델파이를 실행 2,009

편집 : 내 경우에는

<NS1:V NS2:VarArrayType="8204"> 
<V xsi:type="xsd:string">param1</V> 
<V xsi:type="xsd:string">Frank</V> 
<V xsi:type="xsd:byte">1</V> 
<V xsi:type="xsd:byte">1</V> 
</NS1:V> 

같은이 보이는 : 난 그냥 다음과 같은 구조로 마샬링 params 객체를 파라미터를 가지고 샘플 SOAP 요청을 발견 방법 :

<NS1:V NS2:VarArrayType="8204"> 
<V>param1</V> 
<V>Frank</V> 
<V>1</V> 
<V>1</V> 
</NS1:V> 

나는 이것이 내 문제의 근원이라고 생각하지만 내 cl 만드는 법을 모르겠다. xsi : type attribuge를 SOAP 요청에 추가하십시오.

답변

1

발견했습니다. 나는 RegisterInvokeOptions이 XSI를 만들어에

InvRegistry.RegisterInterface(TypeInfo(IMyIntf), MyNamespace, 'UTF-8'); 
InvRegistry.RegisterInvokeOptions(TypeInfo(IMyIntf), [ioDocument, ioHasNamespace, ioIsAppServerSOAP]); 

이 ioDocument을 포함 내 SOAPDataModule을 등록 : 타입이 Variant 형식 데이터에 포함되지 때문이다. 이렇게하면 param 값을 olestring 유형에 대해 언 마샬링합니다. 그래서 내 문제에 대한 해결책은 다음과 같습니다.

InvRegistry.RegisterInvokeOptions(TypeInfo(IMyIntf), [ioHasNamespace, ioIsAppServerSOAP]); 
관련 문제