我在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计算不正确,它们与Actions的PathInfo不匹配,因此没有调用任何映射的Actions,而是回到了DEFAULTACTION。
不知道为什么你的路径信息被改变了,但你有一个相当简单的解决办法让它工作,直到你找出核心问题:
在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;