ASP.NET MVC读取原始JSON后期数据

时间:2013-07-23 22:44:24

标签: asp.net-mvc json jsonfx

这让我发疯了。我正在使用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控制器中使用的解决方案吗?

3 个答案:

答案 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重置为ZeroRequest.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;
            //...
        }
        //...
    }