ASP.NET Core API POST 파라미터는 항상 null입니다.
다음을 읽었습니다.
- Asp.net Core Post 파라미터는 항상 늘입니다.
- asp.net webapi 2 post 파라미터는 항상 null입니다.
- web-api POST 본문 개체는 항상 null입니다.
- Web API 매개 변수는 항상 null입니다.
내 엔드포인트:
[HttpPost]
[Route("/getter/validatecookie")]
public async Task<IActionResult> 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
이치노
요청은 적절한 데이터와 함께 엔드포인트에 게시됩니다.무효로 하다제거하려고 했습니다.[FromBody]
및 """ =
게시된 데이터 앞에 있지만 운이 없습니다. 가지 및 해 보았습니다.
이 특정 작업을 수행하는 이유는 길기 때문에 이 질문에는 문제가 되지 않습니다.
어떤 작업을 해도 파라미터가 항상 무효가 되는 이유는 무엇입니까?
편집: 저도 사용해 보았습니다.{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]
는 '이러다'라는입니다.Content-Type
application/json
, 는 실제로는 "payload"입니다text/plain
. 이는 지원되지 않는 미디어 유형 HTTP 오류 415 Unified Media 유형 HTTP 오류 415 Unified Media 유형 HTTP 오류.
You have at least two options to align then 정렬할 옵션이 두 개 이상 있습니다.Content-Type
그리고 실제 내용입니다.그리고 실제 내용입니다.
응용 프로그램/json 사용
Keep the 보관 유지Content-Type
as ~하듯이application/json
요청 페이로드가 유효한 JON입니다.요구 payload가 유효한 JSON임을 확인합니다.들어 요청 를 다음과 같이 .
{
"cookie": "=sec_session_id=[redacted]; _ga=[redacted]; AWSELB=[redacted]"
}
다음으로 액션시그니처는 JSON 오브젝트와 같은 모양의 오브젝트를 받아들일 필요가 있습니다.
public class CookieWrapper
{
public string Cookie { get; set; }
}
CookieWrapper
dynamic class를 할 수 .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-Type
로로 합니다.text/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
Shaun Luttin의 대답은 효과가 있지만, 중요한 정보 하나를 놓치고 있다.문자열이 인식되지 않는 이유는 문자열이 JSON 문자열이 아니기 때문입니다.
이 작업을 수행합니다.
var payload=JSON.stringify("=sec_session_id=[redacted]; _ga=[redacted]; AWSELB=[redacted]");
그런 다음 컨트롤러를 그대로 둘 수 있습니다.
$.ajax({
url: http://localhost:54093/getter/validatecookie,
type: 'POST',
contentType: 'application/json',
data: payload
});
이것이 내가 알아내는 데 얼마나 오래 걸렸는지 당혹스럽다.누군가에게 도움이 됐으면 좋겠어!
이상하게도 닷넷코어에서는 "from body string parameter"만 사용할 수 없습니다.하나의 문자열 매개 변수에 대해서만 모델 클래스를 만들어야 합니다.
public async Task<IActionResult> GetRankings([FromBody] string cookie)
=>
//1. make a model. MyCookie.cs
class MyCookie{
public string Cookie { get; set; }
}
//2. edit your parameter
public async Task<IActionResult> GetRankings([FromBody] MyCookie cookie)
저는 그냥 덧셈만 하면 돼요.[FromBody]
이 문제를 해결했습니다.
누군가의 시간을 절약해 주길.
저는 이 문제를 오랫동안 고민하다가 DevExpress 컨트롤이 "PUT"을 위해 "Razor Page"에 무엇을 하는지 확인한 후 이 덩어리를 발견했습니다.
자바스크립트
$.ajax({
type: "PUT",
url: "/GoalGrid?handler=Single",
dataType: "json",
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
data: {values: single }
})
GoalGrid.cshtml.cs
public JsonResult OnPutSingle(string values)
{
// Do stuff with 'values' here
}
요령은 application/x-www-form-urlencoded; charset=를 사용하는 것입니다.UTF-8"을 콘텐츠로 사용요청에 대해 입력합니다.이렇게 하면 단일 문자열 값에 대한 클래스를 만들 필요가 없습니다.그리고 모든 것이 예상대로 작동한다.
그냥 따옴표 안에 시체를 넣기만 하면 돼string
요청 유형도 다음과 같이 남겨야 합니다.application/json
이렇게 하면 미디어 타입 포메터가 이를 파악할 수 있습니다.
"=sec_session_id=[redacted]; _ga=[redacted]; AWSELB=[redacted]"
효과가 있을 거야.
에 문자열 데이터를 게시해야 했습니다.Net Desktop Client to.NET Core 호스트지원되지 않는 미디어 오류가 발생했습니다.나는 Shaun Luttin의 대답을 따라 잘 일해왔다.다른 사용자가 유용하다고 생각할 때를 대비해 문자열 데이터를 폴로처럼 쉽게 얻을 수 있는 것을 발견했습니다.
[HttpPost]
[Route("Request/Echo")]
public async Task<string> Echo()
{
using (var Reader = new StreamReader(Request.Body, Encoding.UTF8))
{
return await Reader.ReadToEndAsync();
}
}
이 게시물은 매우 유용합니다.
저 같은 경우에는 @guhyun의 제안대로 string 속성만 포함하는 모델 클래스를 설정했습니다.하지만, 그것은 재산으로 정의되지 않았습니다. 단지
public class PdfInfoRequestDto
{
public string PdfInBase64;
}
그리고 어떤 이유에서인지 이것은 .net 프레임워크 4.7.2 Webapi에서 작동하여 요청 본문으로부터 필요한 값을 받을 수 있었습니다.그러나 동일한 요청, 모델 및 모든 것을 사용하여 .net core 3.1 webapi에서 동일한 복제를 시도하면 항상 pdfInBase64 값이 null로 컨트롤러에 도착합니다.필드를 속성으로 변경한 후:
public string PdfInBase64 { get; set; }
요청 본문에 전달된 값을 올바르게 받기 시작했습니다.
특히 JSON 모델에 대한 모델 바인딩이 묵묵히 실패했다는 점이 문제였습니다.(항상 null이었습니다).
정확한 JSON이 게시되어 있기 때문에 웹 서비스를 로컬로 실행하고 cURL(POSTMAN 사용 가능)을 통해 컨트롤러에 게시함으로써 로컬로 디버깅할 수 있었습니다.
아래 코드를 사용하여 serialization에서 발생하는 정확한 예외를 확인할 수 있었습니다.
[HttpPost]
public IActionResult MyAction([FromBody] dynamic request)
{
if (request != null)
{
try
{
var objAttempt =
JsonConvert.DeserializeObject<MyModel>(
JsonConvert.SerializeObject(request));
}
catch (Exception exception)
{
Console.WriteLine(exception);
throw;
}
}
양쪽 파라미터에서 [FromForm]을 사용하여 수정했습니다.예:
[HttpPost]
public IActionResult Insrtmyinfo([FromForm] string firstparam, [FromForm] string secndparam)
...
언급URL : https://stackoverflow.com/questions/41798814/asp-net-core-api-post-parameter-is-always-null
'source' 카테고리의 다른 글
왜 Instagram의 페이지 수가 같은 페이지를 반복해서 반환하는 걸까요? (0) | 2023.03.28 |
---|---|
권한 문제:Wordpress와 함께 사용할 Windows용 도커 권한을 설정하는 방법 (0) | 2023.03.28 |
Angular에서 배열 내의 객체를 검색해야 합니다. (0) | 2023.03.28 |
angularjs를 사용하여 차트 생성 (0) | 2023.03.28 |
json을 변수에 로드하다 (0) | 2023.03.28 |