您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> VC/MFC >> 写过ISAPI的朋友来看一眼以下两个问题

写过ISAPI的朋友来看一眼以下两个问题

来源:网络整理     时间:2016/8/10 0:46:56     关键词:

关于网友提出的“ 写过ISAPI的朋友来看一眼以下两个问题”问题疑问,本网通过在网上对“ 写过ISAPI的朋友来看一眼以下两个问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 写过ISAPI的朋友来看一眼以下两个问题
描述:

1, 一个ISAPI编译后生成的是一个DLL文件, 访问的时候必须这样:
   isapi.dll?operation?name=111222
  
  这样十分的不友好, 看着dll也不好, 给很多人黑这个网站的想法(printer.dll等漏洞实在是..). 所以能不能最终给用户看到的不是dll后缀的文件格式?
2, ISAPI的command handler可不可以让参数变成可选的?
  假设有一个
ON_PARSE_COMMAND(operation, CMyIsapiExtension, ITS_PSTR ITS_PSTR)
         ON_PARSE_COMMAND_PATAMS("name age")
DEFAULT_PARSE_COMMAND(operation, CMyIsapiExtension)
  访问的时候, 好像是 isapi.dll?operation?name=111222&age=40
  如果用户用 isapi.dll?operation?name=111222 就会出现400 资源不存在的错误. 有什么办法让一个operation的参数是可选的, 少一个, 少几个也都可以使用?


解决方案1:

1,你写的是ISAPI扩展,再写一个ISAPI Filter将后缀dll过滤掉
2、可以的,这样访问的时候就是isapi.dll?action=operation&name=111222&age=40
添加一个参数指示操作。

解决方案2:

对于你的第二个问题,可以用默认参数。
管理已知数量的参数
在示例中,服务器 MOOSE 包含 DLL SURVEY.DLL,而 SURVEY.DLL 包含 CHttpServer 对象 CServerDerived。客户端可使用下面的 URL 调用 RegisterUser 命令:
http://moose/survey/survey.dll?RegisterUser?Richard&M%2E&Jones
该命令调用参数“Richard”、“M.”和“Jones”分别对应于 pstrFirst、pstrMiddle 和 pstrLast 参数的成员函数 RegisterUser。
假定客户端使用下面的 URL 调用 RegisterUser 函数:
http://moose/survey/survey.dll?RegisterUser?Richard&Jones
此调用将收到服务器发出的错误,因为在本例中所有三个参数 pstrFirst、pstrMiddle 和 pstrLast 都是必选参数。可以通过在 ON_PARSE_COMMAND_PARAMS 宏中为它们指定默认值使这些参数成为可选参数。下面的映射使所有的参数成为可选参数:
BEGIN_PARSE_MAP(CServerDerived, CHttpServer)
ON_PARSE_COMMAND(RegisterUser, CServerDerived, ITS_PSTR ITS_PSTR ITS_PSTR)
ON_PARSE_COMMAND_PARAMS("First=~ Middle=~ Last=~")
END_PARSE_MAP(CServerDerived)
上面指定的默认参数是波形符 (~),这是您在处理函数时可以测试的易于识别的字符。
如果客户端使用下面的 URL 调用 RegisterUser:
http://moose/survey/survey.dll?RegisterUser?Richard
如果安装了上面的映射,则第二个和第三个参数被解析为波形符。
如果客户端使用下面的 URL 调用 RegisterUser:
http://moose/survey/survey.dll?RegisterUser?Richard&M%2E&Jones
如果安装了上面的映射,则 RegisterUser 函数的所有三个参数都将正确解析。
可以使一些参数成为可选参数,而使另一些参数成为必选参数,但必选参数必须总是先于任何可选参数出现。例如,可以修改该映射,指示只是中间名称的参数是可选参数:
BEGIN_PARSE_MAP(CServerDerived, CHttpServer)
ON_PARSE_COMMAND(RegisterUser, CServerDerived, ITS_PSTR ITS_PSTR ITS_PSTR)
ON_PARSE_COMMAND_PARAMS("Last First Middle=~")
END_PARSE_MAP(CServerDerived)
注意使指定的参数类型匹配指定的参数默认值。可以同时接受字符串和整数,例如:
BEGIN_PARSE_MAP(CServerDerived, CHttpServer)
ON_PARSE_COMMAND(Enlist, CServerDerived, ITS_PSTR ITS_I4)
ON_PARSE_COMMAND_PARAMS("Title=Developer Level=14")
END_PARSE_MAP(CServerDerived)
并产生预期的结果。但如果颠倒了这两个参数,如:
BEGIN_PARSE_MAP(CServerDerived, CHttpServer)
ON_PARSE_COMMAND(Enlist, CServerDerived, ITS_PSTR ITS_I4)
ON_PARSE_COMMAND_PARAMS("Level=14 Title=Developer")
END_PARSE_MAP(CServerDerived)
则预期为 Level 的默认参数将是 0,而 Title 将是字符串“14”。
若要在默认字符串中添加空格,请用单引号将字符串引起来。不需要转义特殊字符。
ON_PARSE_COMMAND_PARAMS("Title='Technical Writer' Level=14")
管理未知数量的参数
当将未知数量的参数传递给 ISAPI 扩展时,在 ON_PARSE_COMMAND 宏中使用 ITS_RAW 或 ITS_ARGLIST 规范。
如果对正在传递的参数数据一无所知,则使用 ITS_RAW。
例如,如果 Web 页包含一个选择列表,从该列表中可以选择一项或多项,则下面的 ON_PARSE_COMMAND 规范不合适,因为它的参数列表指定它精确接收两个指向字符串的指针:
ON_PARSE_COMMAND(Enlist, CServerDerived, ITS_PSTR ITS_PSTR)
如果 ISAPI 扩展接收的参数多于或少于指定的参数数量,则服务器上将出现错误。当要传递的参数数量不确定时,应将 ON_PARSE_COMMAND 与 ITS_RAW 一起调用。注意在分析原始数据时不要调用 ON_PARSE_COMMAND_PARAMS。但是,必须调用 DEFAULT_PARSE_COMMAND 指定将传递原始数据的函数:
BEGIN_PARSE_MAP(CDerivedExtension, CHttpServer)
DEFAULT_PARSE_COMMAND(Myfunc, CDerivedExtension)
ON_PARSE_COMMAND(Myfunc, CDerivedExtension, ITS_RAW)
END_PARSE_MAP(CDerivedExtension)
使用下面的函数原型发送数据:
void CDerivedClass::Myfunc(CHttpServerContext* pCtxt, void* pVoid, DWORD dwBytes);
pVoid 指针指向发送到扩展的数据。dwBytes 参数含有 pVoid 处的字节数。如果 dwBytes 为零,则它可能指示 pVoid 没有指向任何数据。
如果客户端使用下面的 URL 调用 RegisterUser:
http://mooseboy/derived.dll?Myfunc&selection=10&selection=35&c /> Myfunc 将被调用,其 pVoid 指向字符串“Myfunc&selection=10&selection=35&c /> 如果知道正在传递的数据可被分析为 CHttpArg 对象,使用 ITS_ARGLIST。
当使用 ITS_ARGLIST 时,CHttpServer 服务器对象构造包含零个或多个 CHttpArg 对象的单一 CHttpArgList 对象。CHttpArg 对象按顺序表示在 URL 中传递的激活了 CHttpServer 命令的各个参数。
例如,下列 URL:
http://mooseboy/yourext.dll&Arg1=hockey&Arg2&Arg3=beer+nuts
指示用户的三个参数选择:第一个参数为“hockey”,第二个参数没有数据,第三个参数为“beer”和“nuts”的组合。将相应地设置各个 CHttpArg 对象中 m_pstrArg、m_pstrValue 和 m_pstrRaw 值(注意第二个参数的值是空字符串)。若要了解服务器如何将这些参数分析为 CHttpArgList 和 CHttpArg 对象,请参见 CHttpArgList 中的关系图。
CHttpArgList 对象然后被发送以分析映射函数。为指定此操作,分析映射中的 ON_PARSE_COMMAND 宏应使用参数类型 ITS_ARGLIST。下面是分析映射的一个示例,它使命令函数 Enlist 与 CHttpArgList 对象 CHockeyServer 关联。
BEGIN_PARSE_MAP(CHockeyServer, CHttpServer)
ON_PARSE_COMMAND(Enlist, CHockeyServer, ITS_ARGLIST)
END_PARSE_MAP(CHockeyServer)


以上介绍了“ 写过ISAPI的朋友来看一眼以下两个问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3170442.html

相关图片

相关文章