这让我发疯了。我正在使用ASP.NET MVC。我有一个带有HttpPost操作的控制器,它充当一个由另一个服务器调用的回调URL(不受我的控制)。我想动态读取发布到它的JSON,而不使用WebAPI或模型绑定。该URL还有一个传递给它的查询字符串参数。
回调网址如下所示:
http://domain.com/callback?secret=1234
我尝试使用以下方式阅读发布的输入:
[HttpPost]
public ActionResult Callback( String secret )
{
String jsonData = new StreamReader(this.Request.InputStream).ReadToEnd();
// ...
}
但是“jsonData”始终为null或空。
我只想获取发布的输入并将其粘贴到JsonFx中,以便我可以动态访问内容。关于如何以最简单的方式做到这一点的任何想法?
更新
我发现了以下内容......
虽然上面的内容不起作用(jsonData将为null或为空),但是如果我在调用服务器上配置了什么小选项以便省略“秘密”查询字符串参数,那么下面的内容就是如此,这是关于我的全部内容可以做到这一点,因为它不是我的服务器。在这种情况下,jsonData将具有正确的发布JSON字符串:
[HttpPost]
public ActionResult Callback( /* String secret */ )
{
String jsonData = new StreamReader(this.Request.InputStream).ReadToEnd();
// ...
}
这是非常令人沮丧的解决方法,我不知道在标准MVC控制器上接受查询字符串和发布的JSON数据的简单方法。
我有一个带有Action方法的“回调控制器”,它接受来自不同第三方服务器的各种数据(通过GET,通过表单POST,通过JSON POST,通过带有查询字符串的JSON POST等)。这些是商家类型的回调,我无法控制用于传达信息的格式或方法。我只需要接受回调并处理应该存在的信息。
除了“带有查询字符串的JSON POST”的情况外,所有这些都在我的控制器中正常工作。
这似乎(至少在我看来)是标准ASP.NET MVC控制器的缺点。 ???
有人可以建议一个可以在标准ASP.NET MVC控制器中使用的解决方案吗?
答案 0 :(得分:57)
如果考虑到ASP.NET MVC模型绑定已经读取了流的事实,那么您的初始方法应该有效,因此您应该回滚它:
[HttpPost]
public ActionResult Callback(string secret)
{
Request.InputStream.Seek(0, SeekOrigin.Begin);
string jsonData = new StreamReader(Request.InputStream).ReadToEnd();
// ...
}
答案 1 :(得分:1)
在阅读信息流之前将position
重置为Zero
。
Request.InputStream.Position = 0
答案 2 :(得分:0)
对于ASP.NET Core 2,这对我有用。
[HttpPost]
public ActionResult RawTest() {
using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
{
string content = reader.ReadToEndAsync().Result;
//...
}
//...
}