EIdSocketError в режиме выпуска - PullRequest
3 голосов
/ 05 декабря 2011

Я поддерживаю сервер 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, потому что она может быть не чем иным!

1 Ответ

3 голосов
/ 05 декабря 2011

Зачем вам вообще нужно обрабатывать исключение? EIdSocketError означает, что произошла ошибка сокета. Скорее всего, соединение было потеряно или неправильно закрыто. Индийские соединения на стороне сервера многопоточные. Ошибка сокета означает, что сокет, вероятно, находится в нестабильном состоянии и должен быть закрыт. Если Indy обработает исключение внутри, это остановит поток, принадлежащий соединению, и закроет для вас сокет.

...