datasnap 用のカスタム トランスポート フィルターを作成して使用しようとすると、クライアント アプリを実行すると、次のようなエラーが表示されます。
モジュール ProjectAdminClient.exe の例外 TDBXError。Filter Log Rejected 設定パラメータ FilterUnit に値 1024 が指定されました。この時点で、この非互換性のため、サーバー通信は不可能です。
これは何が原因ですか?
フィルター パラメーターを使用していますか? カスタム トランスポート フィルターも作成しましたが、このエラーは発生しませんでした。何もしないログフィルターの例を次に示します...
unit LogFilter;
interface
uses
SysUtils, DBXPlatform, DBXTransport;
type
TLogFilter = class(TTransportFilter)
public
constructor Create; override;
destructor Destroy; override;
function ProcessInput(const Data: TBytes): TBytes; override;
function ProcessOutput(const Data: TBytes): TBytes; override;
function Id: UnicodeString; override;
end;
const
LogFilterName = 'Log';
implementation
uses
CodeSiteLogging;
constructor TLogFilter.Create;
begin
inherited Create;
CodeSite.Send(csmBlue,'TLogFilter.Create');
end;
destructor TLogFilter.Destroy;
begin
CodeSite.Send(csmBlue,'TLogFilter.Destroy');
inherited Destroy;
end;
function TLogFilter.ProcessInput(const Data: TBytes): TBytes;
begin
Result := Data;
CodeSite.Send(csmYellow, 'ProcessInput ' + IntToStr(Length(Data)),
TEncoding.ASCII.GetString(Data));
end;
function TLogFilter.ProcessOutput(const Data: TBytes): TBytes;
begin
Result := Data;
CodeSite.Send(csmOrange, 'ProcessOutput ' + IntToStr(Length(Data)),
TEncoding.ASCII.GetString(Data));
end;
function TLogFilter.Id: UnicodeString;
begin
Result := LogFilterName;
end;
initialization
TTransportFilterFactory.RegisterFilter(LogFilterName, TLogFilter);
finalization
TTransportFilterFactory.UnregisterFilter(LogFilterName);
end.
これは私にとっては問題なく機能します (近日公開予定の Delphi XE DataSnap Development Essentials コースウェア マニュアルの例の 1 つです)。
グローチェス、ボブ・スワート
ボブ博士のDelphi2010DatasnapホワイトペーパーのLogFilterを使用して同様の問題が発生したときに、この質問を見つけました。
問題は、少なくとも部分的には、ログフィルターを操作しようとしたときに同時にZLibCompressionフィルターをロードしたことです。手がかりはServerContainerUnit1.dfmにありました
Filters = <
item
FilterId = 'ZLibCompression'
Properties.Strings = (
'CompressMoreThan=1024')
end>
同じくエラーになっている1024を見て、ZLibフィルターなしで試す価値があると考えました。クライアントとサーバーから削除しました。これで、ログフィルターが機能します。サーバー時間を取得し、LogFilterコードで機能するブレークポイントを取得します。