【问题标题】:How can I change the Input request stream如何更改输入请求流
【发布时间】:2011-11-04 05:12:01
【问题描述】:

我想更改输入请求流。

详情是:

我想将输入流中的“文本 1”替换为“文本 2”

第一个:我使用Request.Filter作为http://msdn.microsoft.com/en-us/library/system.web.httprequest.filter.aspx但是这样我只能用另一个字节替换一个字节数据,我不能用一个字符串替换一个字符串,我也不能改变缓冲区大小。我需要访问旧缓冲区并将其替换为另一个字节数组(内容和缓冲区长度)

第二个:我尝试使用ISAPI过滤器,但IIS 7及以上版本似乎不再支持SF_NOTIFY_READ_RAW_DATA。我用谷歌搜索,结果是我应该用 CHttpModule::OnReadEntity 事件编写一个本机 HttpModule。对吗?

如果您能告诉我如何更改输入请求流,我将不胜感激。

非常感谢。

【问题讨论】:

  • 我发现我们可以使用原生的HttpModule,如下artice:forums.iis.net/t/1157522.aspx。我尝试更新 ContentType-Length 和 EntityBody(使用 InsertEntityBody),但它没有为我运行。 :(

标签: input stream request


【解决方案1】:

我调试了一下,发现每个请求都会捕获两次。

如果我只读取实体主体,然后再次插入,不做任何更改,第二个请求将具有完全的内容并且请求运行良好。源码如下:

// 检索请求正文。
hr = pHttpRequest->ReadEntityBody(
pvRequestBody, byteCount, false, &byteCount, NULL);
pHttpRequest->InsertEntityBody(pvRequestBody, byteCount);

如果我读取实体正文,然后将'ngo+duc+huy'替换为'ngy+van+qua'(这样成功),第二个请求会有错误的内容。该请求具有一些奇怪内容为:“ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ” P>

所以,请求还没有运行属性。源码如下:

// 检索请求正文。
hr = pHttpRequest->ReadEntityBody(
pvRequestBody, byteCount, false, &byteCount, NULL);
找到 size_t(0);
字符串 requestContent = static_cast(pvRequestBody);

找到 = requestContent.find("ngo+duc+huy");
如果(找到!=字符串::npos)
{
requestContent =
requestContent.replace(requestContent.find("ngo+duc+huy"), sizeof("ngo+duc+huy") - 1,
"ngu+van+qua");
}

        pvRequestBody = (void*)requestContent.c_str();<br />
pHttpRequest->InsertEntityBody(pvRequestBody, byteCount);<br />

你可以下载我的简单解决方案:http://www.4shared.com/file/OJr8GFJQ/HelloWorld_2.html

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 2013-11-08
    • 2017-11-26
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 2019-01-29
    相关资源
    最近更新 更多