Я внедряю веб-службы REST с помощью начального набора WCF REST.
Я получаю запрос в 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 и «реального» метода, обрабатывающего содержимое? Содержание будет потеряно, потому что оно уже прочитано?
Должен ли я дополнительно сделать что-то вроде ".CreateBufferedCopy ()", чтобы тело запроса было доступно для обработки post-RequestInterceptor?
Я не могу понять, почему это так сложно! Это должно быть что-то тривиальное, но, как вы видите, я полностью потерян.
Пожалуйста, кто-нибудь, помогите мне ...
Большое спасибо,
Орасио .-