c# - 如何获取已阅读的内容

标签 c# asp.net asp.net-web-api

我有一个继承自 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/

相关文章:

asp.net - microsoft azure smtp 电子邮件中继设置

c# - 使用 JSON.Net 解析 ISO 持续时间

angularjs - 请求的资源不支持 http 方法 'OPTIONS' .?

c# - PowerCollections - MultiDictionary 'Remove' 在找不到值时删除所有值

c# - 登录应用程序

c# - 带或不带虚拟目录的 CssRewriteUrlTransform

asp.net - SqlException(0x80131904): Line 28: Incorrect syntax near '(' .]

c# - 枚举到字典

c# - 小查询应该异步吗?

azure - 将 Azure AppServices 中的 Web API 的访问限制为 Azure Function 应用程序,同时允许其他服务访问其他 Web api 和网页