我有一个继承自 ApiController 的类。它有一个像这样的 Put 方法:
[PUT("user/{UserId}")]
public HttpResponseMessage Put(string userId, PaymentRequest paymentRequest)
{
// Calling business logic and so forth here
// Return proper HttpResponseMessage here
}
该方法与上面一样工作正常。现在我需要验证方法调用的签名,但在这里我遇到了问题。签名本质上是 method + url + body 的组合。我可以通过调用 Request.Method 获得的方法和我可以通过调用 Request.RequestUri.ToString() 获得的 url,但是我无法像之前那样获得正文 它被 asp.net MVC4 框架自动反序列化为 PaymentRequest 对象。
我的第一次尝试: 据我所知,Request.Content.ReadAsStringAsync().Result 什么都不返回。这是因为内容只能阅读一次。
我的第二次尝试: 我试图将它序列化回 JSON 字符串。
var serializer = new JavaScriptSerializer();
var paymentRequestAsJson = serializer.Serialize(paymentRequest);
问题是格式与签名的正文部分略有不同。它具有相同的数据,但有更多的空间。
我无法更改我的 Put 方法的调用者所做的事情,因为这是第三方组件。我该怎么办?
最佳答案
您可以从底层请求中读取:
using (var stream = new MemoryStream())
{
var context = (HttpContextBase)Request.Properties["MS_HttpContext"];
context.Request.InputStream.Seek(0, SeekOrigin.Begin);
context.Request.InputStream.CopyTo(stream);
string requestBody = Encoding.UTF8.GetString(stream.ToArray());
}
关于c# - 如何获取已阅读的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11901906/