当前位置: 首页 > 面试题库 >

ASP.NET Core API POST参数始终为null

杜轩昂
2023-03-14
问题内容

[HttpPost]
[Route(“/getter/validatecookie”)]
public async Task GetRankings([FromBody] string cookie)
{
int world = 5;
ApiGetter getter = new ApiGetter(_config, cookie);
if (!await IsValidCookie(getter, world))
{
return BadRequest(“Invalid CotG Session”);
}
HttpContext.Session.SetString(“cotgCookie”, cookie);
return Ok();
}


我的请求:

$http.post(ENDPOINTS["Validate Cookie"],  cookie , {'Content-Type': 'application/json'});

cookie我从用户输入中发送的字符串在哪里。

该请求将使用适当的数据发布到端点。但是,我的字符串始终为null。我尝试删除[FromBody]标签,以及=在运气好的情况下在发布的数据前添加。我还尝试了使用上述所有组合添加和删除不同的内容类型。

执行此特定操作的原因很长,与这个问题无关。

无论我做什么,为什么我的参数始终为null?

编辑:我也尝试使用 {cookie: cookie}

Edit2 :请求:

Request URL:http://localhost:54093/getter/validatecookie
Request Method:POST
Status Code:400 Bad Request
Remote Address:[::1]:54093

响应标题

Content-Type:text/plain; charset=utf-8
Date:Mon, 23 Jan 2017 03:12:54 GMT
Server:Kestrel
Transfer-Encoding:chunked
X-Powered-By:ASP.NET
X-SourceFiles:=?UTF-8?B?QzpcVXNlcnNcRG91Z2xhc2cxNGJcRG9jdW1lbnRzXFByb2dyYW1taW5nXENvdEdcQ290RyBBcHBcc3JjXENvdEdcZ2V0dGVyXHZhbGlkYXRlY29va2ll?=

请求标题

POST /getter/validatecookie HTTP/1.1
Host: localhost:54093
Connection: keep-alive
Content-Length: 221
Accept: application/json, text/plain, */*
Origin: http://localhost:54093
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
Content-Type: application/json;charset=UTF-8
Referer: http://localhost:54093/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8

要求有效载荷

=sec_session_id=[redacted]; _ga=[redacted]; AWSELB=[redacted]

问题答案:

问题是is Content- Typeapplication/json,而请求有效载荷实际上是text/plain。这将导致415不支持的媒体类型HTTP错误。

您至少有两个选项可以使Content-Type内容与实际内容对齐。

使用application / json

保留Content-Typeas application/json并确保请求有效负载是有效的JSON。例如,使您的请求有效负载为:

{
    "cookie": "=sec_session_id=[redacted]; _ga=[redacted]; AWSELB=[redacted]"
}

然后,动作签名需要接受与JSON对象具有相同形状的对象。

public class CookieWrapper
{
    public string Cookie { get; set; }
}

代替CookieWrapper类,或者您可以接受动态或a Dictionary<string, string>并像cookie["cookie"]在端点中那样对其进行访问

public IActionResult GetRankings([FromBody] CookieWrapper cookie)

public IActionResult GetRankings([FromBody] dynamic cookie)

public IActionResult GetRankings([FromBody] Dictionary<string, string> cookie)

使用文字/纯文字

另一种选择是将项目更改Content-Typetext/plain,并向项目中添加纯文本输入格式器。为此,请创建以下类。

public class TextPlainInputFormatter : TextInputFormatter
{
    public TextPlainInputFormatter()
    {
        SupportedMediaTypes.Add("text/plain");
        SupportedEncodings.Add(UTF8EncodingWithoutBOM);
        SupportedEncodings.Add(UTF16EncodingLittleEndian);
    }

    protected override bool CanReadType(Type type)
    {
        return type == typeof(string);
    }

    public override async Task<InputFormatterResult> ReadRequestBodyAsync(
        InputFormatterContext context, 
        Encoding encoding)
    {
        string data = null;
        using (var streamReader = context.ReaderFactory(
            context.HttpContext.Request.Body, 
            encoding))
        {
            data = await streamReader.ReadToEndAsync();
        }

        return InputFormatterResult.Success(data);
    }
}

并配置Mvc以使用它。

services.AddMvc(options =>
{
    options.InputFormatters.Add(new TextPlainInputFormatter());
});

也可以看看

https://github.com/aspnet/Mvc/issues/5137



 类似资料:
  • 问题内容: 当我使用下面的ajax调用下面的Post方法时,为什么参数总是为null? 这是通过ajax对Web API方法的调用: 问题答案: 基本上,您只能有一个标量类型的参数,该参数用属性装饰,并且您的请求需要使用,并且POST有效负载应如下所示: 请注意,与标准协议相反,缺少参数名称。您仅发送值。 您可以在中阅读有关Web Api中的模型绑定如何工作的更多信息。 但是,当然,这种黑客入侵是

  • 我试图通过web api microsoft应用程序中的post请求传递对象的参数,但传递的参数始终为null。 这是我的控制器的post方法,在调试下程序达到了方法但是dataUrlIN。url字符串始终为空 这是DataUrl的对象 这是post请求的最新版本 在发送post请求后,方法公共无效Post(Data Url dataUrlIN)中的断点被触发,但url字符串为空HelloWorl

  • 我是Android的新手,现在我在做一个应用,这个应用我需要把数据发送到服务器上,现在我用的是Volley post方法,但是当我用Volley发送数据到服务器上的时候,参数总是显示为空,这里我附上了代码,请检查一下,这里我用的是片段。

  • 我是新来的百里香,我有以下问题。我想在html模板内调用一个java方法,但该方法需要一个参数,但问题是,无论我为参数传递什么,结果总是空的。 类别。html: 分类控制器:

  • 问题内容: 我有一系列通过jQuery Ajax传递给MVC JsonResult操作的参数。在大多数情况下,它们成功到达,但是有一个Date值根本没有到达。 为了使此日期成功到达,我需要使用什么考虑因素/格式?或者我需要采取什么方法? JsonResult操作: 问题答案: Microsoft使用JavaScriptSerializer对ASP.NET MVC数据进行序列化/反序列化。如果使用格

  • 下面是片段。请注意,我已经恢复到以前的提交,因此丢失了最近的修改,但请查看我编写的代码,然后才注意到始终等于0() 以下是当检测到活动后按: 以下是NoteActivity接收结果调用的方式。 null 我在我的项目上浪费了很多重要的时间,只是想知道是什么使resultCode和requestCode的值丢失了我发送的值。 任何帮助和指导都将不胜感激。非常感谢!