2

I built a DataSnap server with Delphi XE2 that implements TDSHTTPService. When the inbound request comes in, TIdIOHandler.InitComponent is called in a thread before execution is handed to the method called in TServerMethods. I do not have any Indy components in the server, so DataSnap is using Indy 10 under-the-hood.

.InitComponent() sets the IO handler's max line length to a hard-coded value (FMaxLineLength := IdMaxLineLengthDefault;), which is 16384. I can't find a way to increase the value. I even tried copying the IdIOHandler Unit to the project folder and changing the constant value. But it still picks up the IdIOHandler.dcu from the Indy 10 build, and ignores the copied file in my project folder. I also tried adding a TIdIOHandlerStream component to the server project and setting its MaxLineLength to no avail.

  • Plan A = Properly set the MaxLineLength value in the DataSnap server.
  • Plan B = Somehow compile a modified IdIOHandler.pas file into my project.

Are either of these possible? I've been working on this for hours and can't find anything similar in all my searching, and can't seem to make any headway by experimenting.

4

2 に答える 2

1

Delphi XE3 ですべての Indy パッケージを再コンパイルし、IdMaxLineLengthDefault 定数を 512 * 1024 に変更し、その後期待どおりに動作した後、この問題に対する最も簡単な解決策を探し始めました。したがって、これがこの制限の簡単な回避策であることがわかりました。

DataSnap REST サーバー プロジェクトのメイン ユニットで使用される TIdHTTPWebBrokerBridge オブジェクトの OnContextCreated イベントのプロシージャを実装できます。その場合、DataSnap サーバーへの要求ごとに作成される AContext オブジェクトが受信されます。したがって、この手順のコードでは、このプロパティのデフォルト値を次のようにオーバーライドするだけです。

procedure TForm1.FormCreate(Sender: TObject);
begin
  FServer := TIdHTTPWebBrokerBridge.Create(Self);

  {Here you assign the new procedure for this event}
  FServer.OnContextCreated:= OnContextCreated; 
end;

procedure TForm1.OnContextCreated(AContext: TIdContext);
begin
   AContext.Connection.IOHandler.MaxLineLength:= 512*1024 {or whatever value you need);
end;
于 2013-07-25T14:42:28.453 に答える
0

Indy 10のDelphi XE2インストールを削除してソースをダウンロードし、定数値を微調整し、自分のビルドをコンパイル/維持するだけで、問題を解決します。

DataSnap サーバーに追加のメソッドを作成して、最初のメソッドを呼び出してデータベースにレコードを作成し、残りのデータを 2 番目のメソッドに一度に 16k ずつ渡すことで、残りのデータを段階的にストリーミングできるようにしました -- バッファリングすべてのパーツが受信されるまで、DataSnap サーバーに保管されます。次に、データベース内のレコードを、DataSnap サーバーからの完全にバッファリングされた値で更新します。

最も効果的なソリューションではないかもしれませんが、機能し、必要に応じて拡張できます。

于 2012-09-07T05:54:09.337 に答える