在基于MFC CHttpServer的遗留web服务器中,我们有一个命令解析映射,如下所示:
BEGIN_PARSE_MAP(MyHttpServer, CHttpServer)
ON_PARSE_COMMAND(MyPage, MyHttpServer, ITS_I4 ITS_I4 ITS_I4 ITS_I4 ITS_PSTR ITS_PSTR ITS_PSTR ITS_I4)
ON_PARSE_COMMAND_PARAMS("intParam1=11 intParam2=12 intParam3=13 intParam4=14 strParam5=s5 strParam6=s6 strParam7=s7 intParam8=18")
END_PARSE_MAP(MyHttpServer)这定义了一个可在http://host/path/dllname.dll?MyPage上访问的页面,该页面最多接受8个参数,这些参数包括intParam1、intParam2、intParam3、intParam4、strParam5、strParam6、strParam7和intParam8。
调用应用程序可以以如下所示的命名方式使用参数调用页面:
http://host/path/dllname.dll?MyPage?intParam4=32&strParam7=somestring但是MFC命令解析映射的工作方式,他们也可以用未命名的参数调用它,只要它们是按照映射定义的顺序提供的:
http://host/path/dllname.dll?MyPage?21&22&23&24&string5&string6&string7&28我想用一个ASP.Net页面替换这段旧代码,但是我们现有的调用应用程序不会被更改,这些应用程序使用两种类型的参数传递(命名和未命名)调用页面。
我可以轻松地管理必要的URL重写,以允许ASP.Net页面响应上面给出的URL,替换路径/dllname.dll?MyPage部分,包含指向.aspx页或.ashx处理程序的路径。
当试图以与旧的MFC参数解析器相当的方式处理未命名的参数时,问题就出现了。Request.QueryString将所有未命名的参数都命名为null,Request.QueryString[null]返回以逗号分隔的值列表。这几乎是可行的,但是如果其中一个参数实际上包含一个逗号,这种编码就会分崩离析,因为额外的逗号没有转义,在逗号上拆分字符串将以太多的参数结束。
在经典的ASP中,我相信Request.QueryString(...)返回了所有同名参数的集合。在ASP.Net中,似乎没有我能找到的等价物。
作为第二个问题,MFC命令解析映射有一些非常复杂的逻辑来处理命名参数和未命名参数的混合。虽然这个页面的调用者不会以这种方式混合他们的用法,但为了完整起见,我对复制逻辑很感兴趣。是否有人能确认MFC的行为本质上是如下所示?
。
另一个有趣的注意是,Request.QueryString.ToString()将几乎重建URL上的原始参数,但它总是将具有相同名称的参数移动到一起,包括我在这里关注的未命名参数。
发布于 2009-09-18 19:58:45
我发现Request.QueryString有一个GetValues()方法。这将返回一个字符串数组,并解决在其中一个值中嵌入逗号的问题。它将比必须拆分Request.QueryString[null]的结果更容易使用。
我还需要做一些工作来实现一个类似MFC的URL参数映射,它同时处理命名参数和未命名参数。
发布于 2009-09-18 02:46:56
不确定是否解决了您的问题,但您可以尝试使用Request.PathInfo。这将提供页面后输入的所有内容,然后您可以使用regex之类的方法手动解析这些内容。
例如,如果您有URL:
http://host/path/dllname.dll?MyPage?21&22&23&24&string5&string6&string7&28Request.PathInfo属性将返回:
?MyPage?21&22&23&24&string5&string6&string7&28将其处理为一组您可以使用的值也可能会出现问题,因为您已经获得了命名和未命名的参数,但是使用正则表达式和/或拆分字符串应该是可以实现的。
https://stackoverflow.com/questions/1442302
复制相似问题