gpt4 book ai didi

delphi - Release模式下的 EIdSocketError

转载 作者:行者123 更新时间:2023-12-03 15:55:10 26 4
gpt4 key购买 nike

我正在维护一个SOAP服务器(带有一个包含THTTPSoapDispatcherTHTTPSoapPascalInvokerTWebModule) TWSDLHTMLPublish)在delphi-XE2中,我找不到处理EIDSocketError的方法(不在 Debug模式下!)。

我什至不确定它是从哪里引发的...我知道它是在用户等待服务器响应时断开连接(请求超时或客户端网络丢失)后引发的。

它肯定是由 IdHTTPWebBrokerBridge 组件引发的,因此我尝试从 myIdHTTPWebBrokerBridge.OnException 处理它,但没有成功。我到处读到它在 Debug模式下被引发但可以避免,但找不到关于如何在 Release模式下处理它甚至阻止它被引发的线索......

如果需要,我可以根据我的应用程序的请求部分提供代码。

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;

[编辑]

'从很久以前回来了。

事实证明,是 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;

我只是不知道如何自己处理异常...

如果我声明 WebModule 的 OnException,我可以记录异常,但无论我如何尝试处理/释放它,它仍然显示弹出窗口:

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 个弹出窗 Eloquent 能继续工作...我就是不能这样留着 ^^

感谢大家的任何建议/意见/解决方案:)

[编辑]

几个月后仍在尝试寻找解决方案,没人知道吗?我厌倦了这个 Delphi 的侵入性和累人的错误,因为它只能如此!

最佳答案

为什么需要处理异常? EIdSocketError 表示发生套接字错误。连接可能已丢失或错误关闭。 Indy 服务器端连接是多线程的。套接字错误意味着套接字可能处于不稳定状态,需要关闭。让 Indy 在内部处理异常将停止连接所属的线程并为您关闭套接字。

关于delphi - Release模式下的 EIdSocketError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8387604/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com