如何在RequestInterceptor(WCF REST入门工具包)中验证Content-MD5标头(来自实际内容) - REST Web服务

时间:2010-07-01 22:18:37

标签: wcf rest md5

我正在通过WCF REST入门套件实现REST Web服务。

我在System.ServiceModel.Channels.RequestContext中获取请求。

具体来说:拦截器以这种方式启动:Public Overrides Sub ProcessRequest(ByRef requestContext As RequestContext)

如果请求包含Content-MD5标头,我必须针对实际内容主体验证提供的散列,对吧?因为这不会“自动”发生。没有人(IIS或其他任何人)正在为我验证这一点,因为我首先想到它会发生。

我认为进行此内容验证很容易。我只需要将请求体作为字符串,并将我的GenerateChecksumForContent()的结果与标题中包含的哈希值进行比较。

如何根据内容计算MD5:

Public Shared Function GenerateChecksumForContent(ByVal content As String) As String
    ' Convert the input string to a byte array and compute the hash.
    Dim hashed As Byte() = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(content))
    ' Convert the hash to a Base64 Encoded string and return it
    Return Convert.ToBase64String(hashed)
End Function

如何获取Content-MD5请求标头值:

Dim message As Message = requestContext.RequestMessage
Dim reqProp As HttpRequestMessageProperty = DirectCast(message.Properties(HttpRequestMessageProperty.Name), HttpRequestMessageProperty)
Dim contentMD5HeaderValue As String = reqProp.Headers("Content-MD5")

我的问题是我不知道如何做一些像计算请求主体的Content-MD5那么简单的事情。

我找不到任何内置属性告诉我这个信息(内容的MD5当前哈希值)。

我试过这个,但它不起作用:

Dim content As String = requestContext.RequestMessage.GetBody(Of String)()
Dim computedMD5 As String = GenerateChecksumForContent(content)

此外,在RequestInterceptor运行和'real'方法处理内容后会发生什么?内容会因为已经阅读而丢失了吗?

我是否还应该执行类似“.CreateBufferedCopy()”的操作来保持请求主体可用于后RequestInterceptor处理?

我无法理解为什么这么复杂!它应该是微不足道的,但正如你所看到的,我完全迷失了。

请有人帮助我......

非常感谢,

奥拉西奥.-

1 个答案:

答案 0 :(得分:0)