直接阅读文章正文

时间:2018-07-26 16:20:24

标签: c# asp.net-core asp.net-core-mvc asp.net-core-2.0

我正在使用Google的re-captcha v2,并且Google的Javascript在运行时会动态生成一个带有键g-recaptcha-response的form参数。标记是这样的:

<form method="post">
    <div class="g-recaptcha" data-sitekey="6LcXjGYUAAAAA...g1UKiZ"></div>
    <input type="submit" id="submit" value="Enter" />
</form>
<script src='https://www.google.com/recaptcha/api.js'></script>

您会注意到没有名称为<input>的{​​{1}}元素,因为它是由Javascript动态生成的。 (注意:以上内容对您不起作用,因为页面网址必须与使用g-recaptcha-response在Google上配置的内容相匹配。)

点击提交后,请求正文如下:

data-sitekey

我不知道如何在这种情况下使用模型。因此,我尝试使用以下代码直接读取请求正文:

g-recaptcha-response=03AEMEkE....nLXmlhwEE&__RequestVerificationToken=CfDJ8Oe....93pb

public async Task<IActionResult> OnPostAsync() { String result; using (StreamReader reader = new StreamReader(Request.Body)) { result = await reader.ReadToEndAsync(); return RedirectToPage("/test"); } } 始终是一个空字符串,即使我发现检查Http流中也有数据。上面的代码有什么错误吗?它可以编译并正确运行。

或者是否有内置的类或方法可以将发布数据返回到Json中?

1 个答案:

答案 0 :(得分:1)

  

...是否有内置类或方法可以返回张贴数据,例如Json?

您的示例是发布表单url编码的数据。内置的[FromForm]属性可以将其绑定到Dictionary<string, string>模型。 Newtonsoft可以将该模型转换为JSON以供服务器端使用,而JsonResult可以将该模型转换为JSON以供客户端使用。

[HttpPost]
public IActionResult Post([FromForm] Dictionary<string,string> model)
{
    // convert to JSON
    var json = Newtonsoft.Json.JsonConvert
        .SerializeObject(model, Newtonsoft.Json.Formatting.Indented);

    Console.WriteLine(json);

    // return JSON
    return new JsonResult(model);
}

如果我们收到这样的帖子...

POST http://localhost:5000/api/values HTTP/1.1
User-Agent: Fiddler
Host: localhost:5000
Content-Length: 85
Content-Type: application/x-www-form-urlencoded

g-recaptcha-response=03AEMEkE....nLXmlhwEE&__RequestVerificationToken=CfDJ8Oe....93pb

...然后我们将看到以下控制台输出。

{                                                   
  "g-recaptcha-response": "03AEMEkE....nLXmlhwEE",  
  "__RequestVerificationToken": "CfDJ8Oe....93pb"   
}