Как проверить заголовок Content-MD5 (из фактического содержимого) в RequestInterceptor (стартовый комплект REST WCF) - веб-служба REST - PullRequest
0 голосов
/ 02 июля 2010

Я внедряю веб-службы 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?

Я не могу понять, почему это так сложно! Это должно быть что-то тривиальное, но, как вы видите, я полностью потерян.

Пожалуйста, кто-нибудь, помогите мне ...

Большое спасибо,

Орасио .-

1 Ответ

0 голосов
/ 09 ноября 2011

Вот две страницы MSDN, которые дают ответ на ваш вопрос:

Надеюсь, одного из них будет достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...