首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在将基于MFC服务器的QueryString CHttpServer转换为ASP.Net时保留CHttpServer语义?

如何在将基于MFC服务器的QueryString CHttpServer转换为ASP.Net时保留CHttpServer语义?
EN

Stack Overflow用户
提问于 2009-09-18 02:20:54
回答 2查看 564关注 0票数 0

在基于MFC CHttpServer的遗留web服务器中,我们有一个命令解析映射,如下所示:

代码语言:javascript
运行
复制
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个参数,这些参数包括intParam1intParam2intParam3intParam4strParam5strParam6strParam7intParam8

调用应用程序可以以如下所示的命名方式使用参数调用页面:

代码语言:javascript
运行
复制
http://host/path/dllname.dll?MyPage?intParam4=32&strParam7=somestring

但是MFC命令解析映射的工作方式,他们也可以用未命名的参数调用它,只要它们是按照映射定义的顺序提供的:

代码语言:javascript
运行
复制
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的行为本质上是如下所示?

  • 使用&作为分隔符,从左到右处理URL中的所有参数。如果命名为
    • (有等号),则将该值应用于具有相应名称的参数,而不管其位置如何。如果该参数已指定值,则错误。如果未命名,则将该值应用于命令解析映射中第n位置的参数,其中n是已处理的未命名参数的数目加上1。如果已为该参数分配了一个值,则error.

  • 将命令解析映射中的默认值应用于未在
  • 上分配的任何参数,如果来自命令解析映射的任何参数未被分配值,则为

另一个有趣的注意是,Request.QueryString.ToString()将几乎重建URL上的原始参数,但它总是将具有相同名称的参数移动到一起,包括我在这里关注的未命名参数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-18 19:58:45

我发现Request.QueryString有一个GetValues()方法。这将返回一个字符串数组,并解决在其中一个值中嵌入逗号的问题。它将比必须拆分Request.QueryString[null]的结果更容易使用。

我还需要做一些工作来实现一个类似MFC的URL参数映射,它同时处理命名参数和未命名参数。

票数 0
EN

Stack Overflow用户

发布于 2009-09-18 02:46:56

不确定是否解决了您的问题,但您可以尝试使用Request.PathInfo。这将提供页面后输入的所有内容,然后您可以使用regex之类的方法手动解析这些内容。

例如,如果您有URL:

代码语言:javascript
运行
复制
http://host/path/dllname.dll?MyPage?21&22&23&24&string5&string6&string7&28

Request.PathInfo属性将返回:

代码语言:javascript
运行
复制
?MyPage?21&22&23&24&string5&string6&string7&28

将其处理为一组您可以使用的值也可能会出现问题,因为您已经获得了命名和未命名的参数,但是使用正则表达式和/或拆分字符串应该是可以实现的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1442302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档