使用streamreader和ReadToEndAsync()从System.Web.HttpContext.Current.Request.InputStream解析JSON

时间:2019-05-31 14:17:56

标签: c# asp.net

我已经在MVC控制器中设置了一个Actionresult,当访问URL时将调用它(routeconfig),并允许从dialogflow JSON请求中发出请求,然后将解析并处理来自此JSON的JSON在我们的目标上/返回适当的JSON。当我尝试使用流读取器ReadToEndAsync进行此操作时,此操作将无效,并且JObject.Parse失败/错误。

我已经尝试过使用continuewith等方法尝试解析JSON的不同方法,但是这些方法似乎无法按预期工作。

Controller ActionResult

public ActionResult JSONQuery()
{

            System.IO.StreamReader reader = new System.IO.StreamReader(System.Web.HttpContext.Current.Request.InputStream);
            reader.BaseStream.Position = 0;
            var requestFromPost = reader.ReadToEndAsync();

            var intentRequestJSON = JObject.Parse(requestFromPost.Result);


            //JToken Name = intentRequestJSON.SelectToken("test.name");

            return new ContentResult { Content = requestFromPost.Result, ContentType = "application/json" };
        }

测试AJAX查询以使我能够在Visual Studio中使用断点进行调试

$.ajax({
            url: 'http://localhost/test/',
            type: 'POST',
            data: {
                json: JSON.stringify({
                    test: "Testing"
                })
            },
            dataType: 'json',
            success: function (data) {
                alert(data);
            },
            error: function (data) {
                alert("Nope");
            }
        });

我期望正确解析JSON,因此我可以对键/值对进行逻辑处理。我现在得到的是:

Newtonsoft.Json.JsonReaderException HResult=0x80131500 Message=Unexpected character encountered while parsing value: j. Path '', line 0, position 0. Source=Newtonsoft.Json StackTrace: at Newtonsoft.Json.JsonTextReader.ParseValue() at Newtonsoft.Json.JsonTextReader.Read() at Newtonsoft.Json.Linq.JObject.Load(JsonReader reader) at Newtonsoft.Json.Linq.JObject.Parse(String json) at TestController.<>c.<DiagflowDivertQuery>b__37_0(Task`1 t) in C:\inetpub\wwwroot\test\Web\Controllers\TestController.cs:line 2988 at System.Threading.Tasks.Task.Execute()

1 个答案:

答案 0 :(得分:0)

经过一番阅读之后,我发现有效(更简单)的方法是:

公共ActionResult JSONQuery() {

        System.IO.StreamReader reader = new System.IO.StreamReader(System.Web.HttpContext.Current.Request.InputStream);
        reader.BaseStream.Position = 0;
        var requestFromPost = reader.ReadToEndAsync();

        dynamic json = JsonConvert.DeserializeObject(requestFromPost.Result);
        string intent = json.queryResult.intent.name;

        return new ContentResult { Content = requestFromPost.Result, ContentType = "application/json" };
    }

希望这对某人有帮助。