返回的TWebRequest.PathInfo不正确,与API引用不匹配

问题描述 投票:1回答:1

我在Delphi 7中使用TWebModule有一个遗留的ISAPI webapp。:o在旧的IIS上运行时工作正常,在较新的IIS上运行时我遇到的问题是PathInfo没有遵循API规范。我不知道IIS何时停止工作,但IIS 6.0可以工作,而IIS 10.0则不行。现在我只是想让这个遗留程序再次在新的IIS上运行。

我已将BeforeDispatch事件附加到TWebModule,并且我将调试消息记录到日志文件中:

procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  DebugU.Write_DB_MSG(
      'Before dispatch: ' + request.ContentFields.text + 'URL  ' + 
      request.URL + ' Query ' + request.QueryFields.Text + '  Host ' + 
      request.Host + ' PATH ' + request.PathInfo);

  {rest of my code here}
end;

在较旧的IIS上,为request.PathInfo显示的内容遵循API描述的内容:

PathInfo API reference

但是在较新的IIS上,如果使用上面API参考中提供的示例,则返回的PathInfo是“/art/gallery.cgi/mammals”而不是预期的“/哺乳动物”

这是一个可以用更新的Delphi或TWebModule解决的问题吗? IIS中的设置是否有错?

我通常可能只是在软件中解决这个问题,但由于PathInfo计算不正确,它们与Actions的PathInfo不匹配,因此没有调用任何映射的Actions,而是回到了DEFAULTACTION。

delphi iis isapi
1个回答
1
投票

不知道为什么你的路径信息被改变了,但你有一个相当简单的解决办法让它工作,直到你找出核心问题:

在BeforeDispatch事件或默认操作处理程序中,根据您在那里执行的其他操作,只需检查路径的最后一个组件,并根据该组件将所有内容传递给正确的处理程序。

你可以用extractfileName做它 - 它会在你的情况下返回PathInfo的最后一部分 - 无论是在最后的斜线之后:

if extractfileName(PathInfo) = 'mammals' then
MammalHandler(Sender,Request, Response,Handled); 

如果您有很多不同的处理请求,请设置映射字典 - 如下所示:

type

THandlerDictionary=TDictionary<string, TWebActionItem>;

...

fHandlerDictionary:=THandlerDictionary.create;
fHandlerDictionary.add('mammals', MammalsHandler);

...

然后你可以这样写:

WebModule.DefaultHandler(Sender: TObject;  Request: TWebRequest;
Response: TWebResponse; var Handled: Boolean);

var handlerPath:string;

begin 

...

handlerPath:=extractfileName(Request.PathInfo) ;
fHandlerDictionary[handlerPath](Sender,Request, Response,Handled); 

...

end;
© www.soinside.com 2019 - 2024. All rights reserved.