I have a class that inherits from ApiController. It has a Put-method like this:
[PUT("user/{UserId}")]
public HttpResponseMessage Put(string userId, PaymentRequest paymentRequest)
{
// Calling business logic and so forth here
// Return proper HttpResponseMessage here
}
The method works fine as it is above. Now I need to validate the signature of the method call, but here I run into a problem. The signature is essentially a combination of method + url + body. The method I can get by calling Request.Method and the url I can get by calling Request.RequestUri.ToString(), but I can't get hold of the body as it was before it was automatically deserialized into a PaymentRequest object by the asp.net MVC4 framework.
My first try: As I have now understood Request.Content.ReadAsStringAsync().Result returns nothing. This is because the content can only be read once.
My second try: I tried to serialize it back to a JSON string.
var serializer = new JavaScriptSerializer();
var paymentRequestAsJson = serializer.Serialize(paymentRequest);
The problem with this is that the formatting turns out slightly different than the body part of the signature. It has the same data, but some more spaces.
I can't change what the caller of my Put-method does, as this is a third party component. What should I do?
A very delayed response, but recently I have had the same challenge to overcome.
I have approached that a bit different without having to get the data from the httpContext (can be quite costly for high volume transaction web application).
I created a simple interface and made each Controller implementing it:
I have then set the Controller's Entity property to the Json payload for each post and put action. Finally, I retrieved the Entity data within the ActionFilterAttribute.OnActionExecuted overridden method and serialised it to Json before injecting into MongoDB:
Hope that helps !
Cheers
You could read from the underlying request:
Don't include the body parameter in the signature and that will allow you to buffer the content and read the content as many times as you like.