我正在通过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处理?
我无法理解为什么这么复杂!它应该是微不足道的,但正如你所看到的,我完全迷失了。
请有人帮助我......
非常感谢,
奥拉西奥.-
答案 0 :(得分:0)