2012-03-22 1 views
2

少し前にanother SOAP related questionと尋ねました。これは、Delphi XE以上で動作するSoap ClientとServerを求めています。SOAPを使用してリモートでDelphiのSOAP経由でクライアントデータセットにデータを読み取っているときに、TXMLTransformから送信されたXML解析エラーは何ですか?

誰もが解決策を見つけられなかったので、Delphi 2007の時代のデモをDelphi XEとXE2の作業状態に戻しました。私はデモが動作している、私はインドのVCLフォームベースのサーバー(インディに実行されているスタンドアロンHTTPサーバー)とSoapサーバーを持っています。サーバーデモの2つの部分は、「カスタムメソッド」(通常のSOAP関数呼び出し)と「リモートデータセット」です。私が働くことができないのはリモートデータセットです。

私が持っているエラーは、私はアクティブなクライアントデータセットを設定したとき、私はデモクライアントにこの行を行う際に、サーバーが例外を送り返し、クライアントの形態である:順番に

ClientDataSet1.Open; 

これがダウンしましたDBClient.pasコード、TDataSet.OpenCursorこのRIO呼び出しによってProviderName = 'XMLTransformProvider1'、 から読み出さしようとしているDoGetRecordsを呼び出しに:

Result := AppServer.AS_GetRecords(ProviderName, Count, RecsOut, Options, 
    CommandText, Params, OwnerData); 
    // ProviderName = 'XMLTransformProvider1', Count = -1, 
    // CommandText = '', Params = NULL, OwnerData = Unassigned 

これは典型的なに示すこの例外で吹きます形式:

`ERemotableException: XML Parse error...`. 
    ERemotableException 
    'XML Parse Error: 
    Reason: The system cannot locate the object specified. 
    '. 

インディソープデータモジュールのためのサーバー側の例外コールスタックを次に示します。

xmlutil.DocParseError(TMSDOMDocument($292C994) as IDOMDocument) 
xmlutil.LoadDocFromFile(???) 
Xmlxform.TXMLTransform.GetData 
Xmlxform.TXMLTransformProvider.InternalGetRecords(???,???,[grMetaData],'',Null) 
Provider.TCustomProvider.DoGetRecords(-1,0,1,'',Null,Null) 
Provider.TCustomProvider.GetRecords(???,0,1,'',Null,Null) 
SOAPDm.TSoapDataModule.GetRecords('XMLTransformProvider1',-1,0,1,'',Null,Null) 
SOAPDm.TSoapDataModule.SAS_GetRecords('XMLTransformProvider1',-1,0,1,'',Null,Null) 
Invoker.TInterfaceInvoker.Invoke(???,('IDataMod', 'DataMod_U', (('', ccReg, 0, 0, nil, nil,(), False), ('', ccReg, 0, 0, nil, nil,(), False), ('', ccReg, 0, 0, nil, nil,(), False), ('SAS_ApplyUpdates', ccStdCall, 3, 5, $401314, $628D50, (([pfConst], 'ProviderName', $4012DC), ([pfReference], 'Delta', $401314), ([], 'MaxErrors', $4010A0), ([pfOut], 'ErrorCount', $4010A0), ([pfVar,pfReference], 'OwnerData', $401314), ([], '', nil)), True), ('SAS_GetRecords', ccStdCall, 4, 7, $401314, $628D50, (([pfConst], 'ProviderName', $4012DC), ([], 'Count', $4010A0), ([pfOut], 'RecsOut', $4010A0), ([], 'Options', $4010A0), ([pfConst], 'CommandText', $4012DC), ([pfVar,pfReference], 'Params', $401314), ([pfVar,pfReference], 'OwnerData', $401314), ([], '', nil)), True), ('SAS_DataRequest', ccStdCall, 5, 2, $401314, $628D50, (([pfConst], 'ProviderName', $4012DC), ([pfReference], 'Data', $401314), ([], '', nil)), True), ('SAS_GetProviderNames', ccStdCall, 6, 0, $40BC38, $628D50, (([], '', nil)), True), ('SAS_GetParams', ccStdCall, 7, 2, $401314, $628D50, (([pfConst], 'ProviderName', $4012DC), ([pfVar,pfReference], 'OwnerData', $401314), ([], '', nil)), True), ('SAS_RowRequest', ccStdCall, 8, 4, $401314, $628D50, (([pfConst], 'ProviderName', $4012DC), ([pfReference], 'Row', $401314), ([], 'RequestType', $4010A0), ([pfVar,pfReference], 'OwnerData', $401314), ([], '', nil)), True), ('SAS_Execute', ccStdCall, 9, 4, nil, $628D50, (([pfConst], 'ProviderName', $4012DC), ([pfConst], 'CommandText', $4012DC), ([pfVar,pfReference], 'Params', $401314), ([pfVar,pfReference], 'OwnerData', $401314), ([], '', nil)), True), ('CustomMethod', ccStdCall, 10, 0, $4012CC, $62E668, (([], '', nil)), True)), (45872836, 16917, 16768, (153, 166, 192, 149, 84, 207, 120, 216)), $62E668, $628D50, 10),4,$2942270) 
SOAPPasInv.TSoapPascalInvoker.Invoke(???,???,'',$28F3700,$28F36A0,???) 
SOAPHTTPPasInv.THTTPSoapPascalInvoker.DispatchSOAP('/SOAPDMServerWAD.Sample/soap/IDataMod',???,$28F3700,$28F36A0,btSoap) 
WebBrokerSOAP.THTTPSoapDispatcher.DispatchRequest(???,???,$29421C8) 
HTTPApp.DispatchHandler($28E4140,THTTPSoapDispatcher($291687C) as IWebDispatch,$290FEA0,$29421C8,False) 
HTTPApp.TCustomWebDispatcher.DispatchAction($290FEA0,$29421C8) 
HTTPApp.TCustomWebDispatcher.HandleRequest(???,???) 
HTTPApp.TDefaultWebAppServices.InvokeDispatcher 
HTTPApp.TDefaultWebAppServices.HandleRequest 
WebReq.TWebRequestHandler.HandleRequest($290FEA0,$29421C8) 
IdHTTPWebBrokerBridge.TIdHTTPWebBrokerBridgeRequestHandler.Run(???,$28851B0,???) 
IdHTTPWebBrokerBridge.TIdHTTPWebBrokerBridge.DoCommandGet(???,???,???) 
IdCustomHTTPServer.TIdCustomHTTPServer.DoExecute($293AB30) 
IdContext.TIdContext.Run 
IdTask.TIdTask.DoRun 
IdThread.TIdThreadWithTask.Run 
IdThread.TIdThread.Execute 
Classes.ThreadProc($28A1FE0) 

何が起こっている私は信じたちは、空のHTTPレスポンスを取得しているということです。何もうまくいかない場合、これは私にとって完璧な意味を持ちます。私たちがアクセスしているHTTPのURLは機能しません。私たちがアクセスしているURLがあり、Webブラウザ経由でアクセス可能です:

http://localhost:8088/?intf=IDataMod 

エラーメッセージの原因となったクライアントに戻って来ているXMLは次のようになります。

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"> 
<SOAP-ENV:Body> 
    <SOAP-ENV:Fault> 
    <faultcode>SOAP-ENV:Server</faultcode> 
    <faultstring>XML Parse Error:'#$D#$A#$D#$A'Reason: The system cannot locate the object specified.'#$D#$A#$D#$A#$D#$A'</faultstring> 
    <faultactor/> 
</SOAP-ENV:Fault> 
</SOAP-ENV:Body></SOAP-ENV:Envelope> 

私の質問SOAPエラーはどういう意味ですか、なぜそれが起こっているのですか?どのように修正しますか?

+1

私はプロキシ(Fiddler)を使用し、作業用(WAD)バージョンと非稼動バージョンのリクエスト/回答を比較します。 URLは機能している可能性がありますが、ブラウザはHTTP GETリクエストを送信し、SOAPは通常POSTも使用します。 – mjn

答えて

1

この場合、クライアントがサーバー側で例外が発生したという通知を受信したことを意味します。サーバー側の例外はデモコードの問題が原因で発生していたため、デモサーバーを修復して正常に動作するようにしました。

Delphi 2007に同梱されているSOAPサーバーのSoapDataModuleサンプルフォルダでは、エラーチェックが行われないという問題があります。 XMLサンプルデータを読み込めない場合(データフォルダが移動したか、または存在しないため)、サーバー側で処理されない例外が発生して爆発します。

SOAPには、自分の仕事を自動化する素晴らしい機能があります。クライアントは、私たちが石鹸呼び出しを受け取ったという通知を受け取り、実際の応答ではなく石鹸例外を取り戻します。 SOAPを非難することはできません.Delphi SOAP RTLは実際には使いやすいです。しかし、ここで取り除くべき根底にある点は、SOAPサービスの実装者が、起動時にSOAPサーバーの健全性検査を行うべきであるため、SOAP要求に対して致命的でなければならないエラーを修復できることです。

レッスンを受けました。 SOAPサーバーを構築するときは、最初のSOAPサーバーセッションの前に、構成エラー処理と致命的エラー検出を開始タスクとして検討してください。