【发布时间】:2011-03-15 11:41:15
【问题描述】:
概述
我希望能够将请求参数和内容修改为第 3 方 Web 服务 (ArcGIS Server)。这将用于创建存在于任何客户端应用程序和服务器应用程序之间的安全层。
我认为我已经找到了解决方案,但我目前在实施中遇到了一些困难。
可能的解决方案:使用自定义请求过滤器修改请求
对于解决方案,我基于sample shown on MSDN 松散地实现了自定义请求过滤器。我已经“增强”了代码,以便我可以使用正则表达式搜索和替换必要的内容。这涉及:
- 将内容(存储在字节数组中)转换为字符串。
- 搜索字符串并执行任何必要的修改。
- 将修改后的字符串转换为字节数组并写入缓冲区。
一个例子如下所示:
public override int Read(byte[] buffer, int offset, int count)
{
int bytesRead = _stream.Read(buffer, offset, count);
string orgContent = Encoding.UTF8.GetString(buffer, offset, bytesRead);
string orgContentDecoded = HttpUtility.UrlDecode(orgContent);
string layersPattern = @"&layers=(show|hide|include|exclude):([0-9]+,?)+";
Regex layersRegex = new Regex(layersPattern, RegexOptions.IgnoreCase);
string[] permittedLayers = new string[] { "0" , "1" };
string replacementLayers = "&layers=show:" + String.Join(",", permittedLayers);
string newContentDecoded = layersRegex.Replace(orgContentDecoded, replacementLayers);
string newContent = newContentDecoded.Replace(",", "%2C").Replace(":", "%3A");
byte[] newBuffer = Encoding.UTF8.GetBytes(newContent);
int newByteCountLength = Encoding.UTF8.GetByteCount(newContent);
Encoding.UTF8.GetBytes(newContent, 0, Encoding.UTF8.GetByteCount(newContent), buffer, 0);
return bytesRead;
}
只要修改后的内容长度与原始内容长度没有差异,这似乎效果很好。例如,如果我用 2 替换 1 一切正常。但是,如果我将 1 替换为 10(从而将消息大小增加 1),那么我会收到来自 ArcGIS Server 的错误,指出该格式不受支持。
这让我注意到了两个问题:
- 当前实现不处理分块请求。也就是说,如果请求 sie 足够大,则单个请求可能会多次调用 Read。 在这种情况下应该如何处理分块?
- 错误消息的根本原因是什么?问题是否与内容长度与流长度不同? 如何正确修改内容,以免更改其长度?
有什么想法吗?
【问题讨论】:
标签: c# asp.net iis iis-7 httpmodule