我在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描述的内容:
但是在较新的IIS上,如果使用上面API参考中提供的示例,则返回的PathInfo是" /art/gallery.cgi/mammals"而不是预期的" /哺乳动物"
这是一个可以用新的Delphi或TWebModule解决的问题吗? IIS中的设置是否有错?
我通常可能只是在软件中解决这个问题,但由于PathInfo计算不正确,因此它们与Action的PathInfo不匹配,因此没有调用任何映射的Actions,而是回到默认动作。
答案 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;