【问题标题】:Internal Server Error calling a Datasnap server using Indy使用 Indy 调用 Datasnap 服务器的内部服务器错误
【发布时间】:2015-02-16 14:57:06
【问题描述】:

我已经建立了一个非常基本的 DataSnap 服务器应用程序 (Delphi XE3),其中包含 2 个示例方法,EchoString 和 ReverseString。我添加了身份验证,因此只有调用该方法的用户称为“标准”时,他们才能访问 ReverseString 方法。

procedure TServerContainer1.DSAuthenticationManager1UserAuthenticate(
Sender: TObject; const Protocol, Context, User, Password: string;
var valid: Boolean; UserRoles: TStrings);
begin
  valid := (User <> '');

  if (SameText(User, 'standard') = True) then
  begin
    UserRoles.Add('standard');
  end;
end;

type
TServerMethods1 = class(TDSServerModule)
private
  { Private declarations }
public
  { Public declarations }
  function EchoString(Value: string): string;
  [TRoleAuth('standard')]
  function ReverseString(Value: string): string;
end;

如果我直接从浏览器调用此方法,例如

http://localhost:8080/datasnap/rest/TServerMethods1/ReverseString/TestFromBrowser

然后我得到预期的响应(在浏览器的默认登录提示之后,我输入了一个无效的用户,例如 Jason):

{"error":"jason is not authorized to perform the requested action."}

但是,如果我使用 Indy (TIdHTTP) 从 Delphi 客户端应用程序调用它:

IdHTTP1.Request.BasicAuthentication := True;
IdHTTP1.Request.Username := 'jason';
IdHTTP1.Request.Password := 'jason';

Label2.Caption := IdHTTP1.Get('http://localhost:8080/datasnap/rest/TServerMethods1/ReverseString/TestFromDelphi');

我收到以下回复:

HTTP/1.1 500 Internal Server Error

如何避免错误并收到与浏览器中相同的 RESTful 响应?我一直在试图弄清楚如何查看浏览器发送的 HTTP 请求与 Indy 发送的 HTTP 请求,但没有管理它,即使使用 Ethereal。

【问题讨论】:

  • 要捕获请求和响应,您可以使用 Fiddler 2 作为 HTTP 代理
  • 谢谢 mjn 我去看看。
  • 或 Wireshark(Ethereal 的继任者),因为连接不使用 SSL。如果您使用 Fiddler,则必须相应地配置 TIdHTTP.ProxyParams 属性,以便 TIdHTTP 将连接到 Fiddler。
  • DataSnap 服务器支持哪些 HTTP 身份验证方案?如果不使用其他身份验证,BasicAuthentication := True 允许 TIdHTTP 回退到 BASIC 方案。 TIdHTTP.OnSelectAuthorization 事件的 AuthInfo 参数中报告了哪些值?这将告诉您服务器支持哪些方案(如果您在 Wireshark/Fiddler 中看不到它)。 TIdHTTP 使用插件架构进行 HTTP 身份验证,因此请确保已将相关的 IdAuthentication... 单元添加到您要启用的每个方案的 uses 子句中。
  • 感谢 Remy,将进一步了解。据我所知,Datasnap 仅支持基本身份验证,这对于我需要的目的来说很好。

标签: delphi indy datasnap


【解决方案1】:

我已经能够确定发生了什么。使用 Wireshark 和 Rawcap(捕获本地环回请求),我可以看到即使浏览器正在显示有意义的消息:

{"error":"jason is not authorized to perform the requested action."}

它还返回 HTTP 500 内部服务器错误。但是,有意义的响应文本也会作为此响应的一部分返回,并由浏览器显示。

检查 Indy HTTP 响应,是一样的;实际的响应代码是 500,但我要显示的文本也正在返回。

这可以通过捕获EIdHTTPProtocolException 并访问其ErrorMessage 属性来访问。

【讨论】:

    猜你喜欢
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 2017-04-12
    • 2016-06-16
    • 1970-01-01
    相关资源
    最近更新 更多