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

时间:2018-03-08 22:41:09

标签: delphi iis isapi

我在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计算不正确,因此它们与Action的PathInfo不匹配,因此没有调用任何映射的Actions,而是回到默认动作。

1 个答案:

答案 0 :(得分: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;