Я поддерживаю сервер SOAP (с TWebModule , содержащим THTTPSoapDispatcher , THTTPSoapPascalInvoker и TWSDLHTMLPublish ) в delphi-XE2 , и я не могу найти способ обработать EIDSocketError (не в режиме отладки!).
Я даже не уверен, гдеэто вызвано из ... Я знаю, что оно возникает после того, как пользователь отключился во время ожидания ответа от сервера (тайм-аут запроса или потеря сети на стороне клиента).
Это, безусловно, вызвано IdHTTPWebBrokerBridge *Компонент 1020 *, поэтому я попытался обработать его с myIdHTTPWebBrokerBridge.OnException
безуспешно.Я тут и там читал, что он был поднят, но его можно избежать в режиме отладки, но я не могу найти подсказку о том, как обращаться с ним в режиме выпуска или даже не дать ему подняться ...
Я могу предоставитьпри необходимости укажите код в запрашиваемой части моего заявления.
MyService.exe
program MyService;
{$APPTYPE GUI}
{$R 'documents.res' 'documents.rc'}
uses
Forms,
Sysutils,
WebReq,
IdHTTPWebBrokerBridge,
UFMyService in 'Unit\UFMyService.pas' {FMyService},
UWMMyService in 'Unit\UWMMyService.pas' {WMMyService: TWebModule},
UDMMyService in 'Unit\UDMMyService.pas' {DMMyService: TDataModule},
UIMyService in 'Unit\UIMyService.pas',
UCMyService in 'Unit\UCMyService.pas',
superobject in 'Unit\superobject.pas',
superxmlparser in 'Unit\superxmlparser.pas',
{$R *.res}
const
se = '/';
begin
if WebRequestHandler <> nil then
WebRequestHandler.WebModuleClass := WebModuleClass;
Application.Initialize;
Application.Title := 'My Service';
try
Application.CreateForm(TFMyService, FMyService);
Application.Run;
Except on E:Exception do
begin
Log('!! Exception au lancement : '+E.Message);
Application.Terminate;
end;
end;
end.
, затем в
UFMyService.pas
unit UFMyService;
interface
uses (...)
type
TFMyService = class(TForm)
ApplicationEvents1: TApplicationEvents;
procedure FormCreate(Sender: TObject);
procedure ApplicationEvents1Exception(Sender: TObject; E: Exception);
(...)
private
FServer: TIdHTTPWebBrokerBridge;
procedure handleException(AContext: TIdContext; AException: Exception);
(...)
end;
var
FMyService: TFMyService;
implementation
{$R *.dfm}
uses
UWMMyService, UDMMyService, (...);
procedure TFMyService.ApplicationEvents1Exception(Sender: TObject; E: Exception);
begin
if not(E is EIdConnClosedGracefully) and not (E is EIdConnClosedGracefully) then
begin
Log(e.Message);
end;
end;
procedure TFMyService.FormCreate(Sender: TObject);
begin
(...)
FServer := TIdHTTPWebBrokerBridge.Create(Self);
FServer.OnException := handleException;
(...)
end;
procedure TFMyService.handleException(AContext: TIdContext; AException: Exception);
begin
if not(AException is EIdSilentException) and not(AException is EIdConnClosedGracefully) then
begin
Log(AException.Message);
end;
end;
[edit]
'Назад в возрасте.
Оказывается, это delphi и его TWebRequestHandler, который отображает всплывающее окно:
procedure TWebRequestHandler.HandleException(Sender: TObject);
var
Handled: Boolean;
Intf: IWebExceptionHandler;
begin
Handled := False;
if ExceptObject is Exception and
Supports(Sender, IWebExceptionHandler, Intf) then
try
Intf.HandleException(Exception(ExceptObject), Handled);
except
Handled := True;
System.SysUtils.ShowException(ExceptObject, ExceptAddr);
end;
if (not Handled) then
System.SysUtils.ShowException(ExceptObject, ExceptAddr);
end;
Я просто не знаю, как обрабатывать исключение сам ...
, если я объявляю OnException длямой WebModule, я могу зарегистрировать исключение, но независимо от того, как я пытаюсь его обработать / освободить, оно все равно отображает всплывающее окно:
procedure TWMMyService.WebModuleException(Sender: TObject; E: Exception;
var Handled: Boolean);
var
AnError : TObject;
begin
Log('!! WebModule Error ('+Sender.ClassName+')');
Log('!! Type : '+E.ClassName);
Log('!! Message : '+E.Message);
Handled:=True;
// later add-on
if( E is EIdSilentException) then
begin
//Socket 10054 Connection reset by peer.
//etc...
AnError := AcquireExceptionObject;
if (AnError <> nil) then
begin
Log('!! Ignore Exception');
ReleaseExceptionObject;
end;
end; // then the popup appears...
end;
Log('!! Ignore Exception');
достигнуто, но ReleaseExceptionObject не имеет никакого эффекта;может быть, слишком поздно.
я изменил WebRequestHandler.MaxConnections на 100, чтобы предотвратить слишком быстрое замедление работы клиентов из-за этих исключений сокетов, но представьте, что мне нужно проверить 100 всплывающих окон, чтобы продолжить работу ... я просто не могу уйтиэто так ^^
Спасибо всем за любые предложения / советы / решения:)
[edit]
Все еще пытаетесь найти решение спустя месяцы, никто не знает?Я устал от этой навязчивой и утомительной ошибки в Delphi, потому что она может быть не чем иным!