【问题标题】:Creating an XML document in Embarcadero RAD Server 10.3在 Embarcadero RAD Server 10.3 中创建 XML 文档
【发布时间】: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。它可以修改被捕获的ExceptionMessage,然后重新提升它,例如:on E: Exception do begin E.Message := E.Message + ' @ ' + sPlace; raise; end;。这样,原始异常的任何类型信息和额外细节都不会丢失。
  • 你说你在 BPL 中有这段代码。您是否检查过您的生产服务器是否可能缺少您在开发环境中存在的特定 BPL 所需的其他一些 BPL?

标签: xml delphi rad


【解决方案1】:

我最终做的是通过将 Omnixml 设置为默认 DOM 供应商来删除 msxml 依赖项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 2012-11-13
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多