【发布时间】:2020-07-06 16:35:30
【问题描述】:
我在 RAD 服务器中有一个端点,它生成并返回一个 XML 文档。这段代码在开发环境中工作得很好。但是,当我将 bpl 复制到在 Windows 上运行 Apache 的生产服务器时,它会返回 500 错误。 我发现这是导致错误的对 NewXMLDocument 的代码调用。我只是不知道为什么它可以在开发服务器上运行,但不能在生产服务器上运行,而且我不知道如何从生产服务器获取任何进一步的诊断信息。
代码如下,我删除了一些不影响错误的代码。有人有什么想法吗?
编辑:我能够更进一步,现在它在以下位置抛出 500 错误:
RootNode := resultDoc.AddChild('root');
已解决:发现问题出在服务器上的 MSXML 上。切换到 Omnixml 作为默认 DOM 供应商,一切似乎都正常。谢谢大家。
procedure TQResource1.GetIMCansXML(const AContext: TEndpointContext;
const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
var
sPlace : String;
resultDoc : IXMLDOCUMENT;
RootNode : IXMLNODE;
myStream : TMemoryStream;
begin
CoInitialize(nil);
iNumRows := 0;
Try
Try
SetDBConnection(AContext.User.UserName);
myStream := TMemoryStream.Create;
sPlace := '2';
resultDoc := NewXMLDocument;
sPlace := '3';
resultDoc.Encoding := 'utf-8';
resultDoc.Options := [doNodeAutoIndent];
sPlace := '4';
RootNode := resultDoc.AddChild('root');
resultDoc.SaveToStream(myStream);
myStream.Position := 0;
Except
on e1: exception do
begin
raise Exception.Create(e1.Message + ' @ ' + sPlace);
end;
End;
Finally
AResponse.Body.SetStream(myStream, 'application/xml', True);
CoUninitialize;
End;
end;
【问题讨论】:
-
您在 prod 服务器上运行什么操作系统?尝试制作一个调用
NewXMLDocument的小型控制台应用程序并在产品服务器上运行它。 -
Window Server 2008 RS。旧的,我知道,但它计划很快升级。
-
我创建了一个小型 Windows 应用程序,它也调用了 NewXMLDocument 方法,它在服务器上运行时不会抛出错误。
-
@KenDavis
NewXMLDocument()是否引发异常?另外,在调用CoUninitialize()之前需要将resultDoc显式设置为nil,否则之后会被释放,会导致COM出现问题。附带说明一下,您的except处理程序确实不需要提出新的Exception。它可以修改被捕获的Exception的Message,然后重新提升它,例如:on E: Exception do begin E.Message := E.Message + ' @ ' + sPlace; raise; end;。这样,原始异常的任何类型信息和额外细节都不会丢失。 -
你说你在 BPL 中有这段代码。您是否检查过您的生产服务器是否可能缺少您在开发环境中存在的特定 BPL 所需的其他一些 BPL?