게시물 매개 변수는 항상 null


197

WebAPI를 위해 RC로 업그레이드 한 후 WebAPI에서 POST를 호출 할 때 이상한 문제가 발생합니다. 새 프로젝트에서 생성 된 기본 버전으로 돌아갔습니다. 그래서:

public void Post(string value)
{
}

그리고 피들러에서 전화 :

Header:
User-Agent: Fiddler
Host: localhost:60725
Content-Type: application/json
Content-Length: 29

Body:
{
    "value": "test"
}

디버깅 할 때 문자열 "value"가 할당되지 않습니다. 항상 NULL입니다. 이 문제가있는 사람이 있습니까?

(처음에는 더 복잡한 유형의 문제를 보았습니다)

이 문제는 ASP.NET MVC 4에만 국한된 것이 아니라 RC 설치 후 새로운 ASP.NET MVC 3 프로젝트에서도 동일한 문제가 발생합니다.


문제에 추가하기 위해-JSON에만 국한되지는 않으며 XML에서도 발생합니다.
— ianrathbone

3
나는 이틀 동안 이것으로 싸우고 있었고 내가 찾을 수있는 모든 기사를 읽은 후에는 WebRequest에서 JSON 문자열을 올바르게 형식화하는 것처럼 간단하다는 것이 밝혀졌습니다 : 데이터는 큰 따옴표로 시작하고 끝나야합니다. json 데이터 전체에서 작은 따옴표를 사용하면 모두 좋습니다.
— Gineer

답변:


101

하나의 매개 변수 만 있으므로 [FromBody]특성으로 매개 변수를 꾸미 거나 여기에서 제안한 것처럼 값을 속성으로 사용하여 DTO를 허용하도록 메서드를 변경할 수 있습니다. MVC4 RC WebApi 매개 변수 바인딩에서 매개 변수를 꾸미거나

업데이트 : 공식 ASP.NET 사이트는 오늘 훌륭한 설명으로 업데이트되었습니다 : https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part- 1

간단히 말해서, 본문에 단일 단순 유형을 보낼 때 등호 (=)로 시작하는 값만 본문과 같이 보내십시오.

=test


9
나는 [FromBody]에게 소용돌이를 주었지만 아무런 변화가 없었습니다
— ianrathbone


8
=앞 의 추가 기능 은 Jim의 조언 (JSON 객체가 아닌)에서 Jim의 조언을 따를 때까지 결코 효과가 없었습니다. 이것이 열쇠입니다! 나는 까다로운 WebAPI가 마음에 들지 않습니다.
— gitsitgo

16
이것은 너무 어리 석고 짜증나서 내 문제를 해결하는 데 도움이되는 답변을 공감 또는 공감 해야하는지 모르겠습니다 ... 왜 지구상 에서이 형식이어야합니까? (태도에 대해 유감스럽게도, 너무 많은 시간을 낭비했으며 아무런 의미가 없습니다 ... :(). 사람들이 받아 들일 것으로 예상되는 형식에 대한 지원을 추가해야합니다.
— gdoron이 Monica를 지원합니다.

6
감사! 하나의 매개 변수 만 보낼 때 매개 변수 이름을 제거해야한다는 것을 지구상에서 어떻게 알 수 있습니까? 어떤 아이디어가이 아이디어를 내놓았습니까?
— Jenny O'Reilly

104

나는 오늘 이것에 대해 머리를 긁었다.

내 솔루션은 변화하는 [FromBody]A를 HttpRequestMessage기본적으로 HTTP 스택을 이동.

제 경우에는 유선을 통해 데이터를 전송하고 압축 된 json은 base64입니다. 이 모든 것이 안드로이드 앱에서 제공됩니다.

내 웹 엔드 포인트의 원래 서명은 다음과 같습니다 (사용 [FromBody]).

내 원래 끝점

이 문제에 대한 나의 픽스는 HttpRequestMessage엔드 포인트의 서명 을 사용하여 되 돌리는 것이었다 .

여기에 이미지 설명을 입력하십시오

그런 다음이 코드 줄을 사용하여 게시물 데이터에 액세스 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

이것은 작동하며 손대지 않은 원시 포스트 데이터에 액세스 할 수있게합니다. 피들러가 문자열의 시작 부분에 = 기호를 넣거나 내용 유형을 변경하는 것을 망칠 필요가 없습니다.

따로, 나는 먼저 컨텐츠 유형을 "Content-Type : application / x-www-form-urlencoded"로 변경하는 위의 답변 중 하나를 따르려고했습니다. 원시 데이터의 경우 + 문자를 제거하므로 좋지 않은 조언입니다.

따라서 다음과 같이 시작하는 base64 문자열 : "MQ0AAB + LCAAAAAA"는 "MQ0AAB LCAAAAAA"와 같이 끝납니다! 당신이 원하는 것이 아닙니다.

사용의 또 다른 이점은 HttpRequestMessage엔드 포인트 내에서 모든 http 헤더에 액세스 할 수 있다는 것입니다.


6
우수한 솔루션입니다 ...이를 찾기 위해 9시간 걸렸다, 내가 [FromBody] 문자열 값을 제거 후에 내 문제를 분류하고 HttpRequestMessage로 교체
— 케빈

1
매력처럼 작동합니다! 그러나 특정 객체의 실제 매개 변수 유형을 사용하는 방법이 없습니까? 예를 들어, 웹 API 메소드의 Order 유형 매개 변수?
— Ron Nuni

7
참고로, HttpRequestMessage request항상 이미 가지고 있기 때문에 메소드 서명에 필요하지 않습니다 . 메소드 본문에서는 Request오브젝트에서 액세스 할 수 있습니다 . 예Request.Content.ReadAsStringAsync().Result;
— Morvael

일반적으로이 문제는 JSON 객체가 올바르지 않기 때문입니다. 나는 이것이 항상 생성자에서 유효하지 않은 유형을 가지고 있기 때문에 Json은 그것을 Guid를 문자열로 변환하는 방법을 모른다. 따라서 설정을 통해 변환기를 추가하거나 빈 생성자를 추가하면 이와 같은 이전 코드로 돌아갈 필요가 없습니다.
— Nick Turner

가장 쉬운 방법은 객체를 문자열로 전환 한 다음 변환하여 JSON 오류를 보는 것입니다. 헤더인지 확인하십시오.
— Nick Turner

71

Fiddler를 사용하여 방금 발생했습니다. 문제는 내가 지정하지 않았다는 것 Content-Type입니다.

Content-TypePOST 요청에 헤더를 포함 하십시오.

Content-Type: application/x-www-form-urlencoded

또는 아래 의견에 따라 JSON 헤더를 포함해야 할 수도 있습니다

Content-Type: application/json

11
Content-Type : application / json
— dvallejo

2
게시물에 지정된대로-이미 Content-Type을 추가했습니다 : application / json
— ianrathbone

2
application / x-www-form-urlencoded가 작동하지 않았으며 Content-Type : application / json이 작동했습니다.
— liang

1
content-type에 관계없이 하나의 매개 변수 만있는 경우 요청 본문에 매개 변수 이름이없는 값만 보내야합니다. 따라서 id = 13이 작동하지 않습니다. 13을 혼자 보내셔야합니다. Jim의 답변을 참조하십시오.
— Jenny O'Reilly

내가 사용했다 contentType: "application/x-www-form-urlencoded; charset=UTF-8"완전한 예를 들어보고, 전체 효율적인 및 서버
— RyBolt

57

나는이 문제에 부딪 쳤으며 이것이 내 문제를 해결하는 방법입니다.

webapi 코드 :

public void Post([FromBody] dynamic data)
{
    string value = data.value;
    /* do stuff */
}

클라이언트 코드 :

$.post( "webapi/address", { value: "some value" } );

1
클라이언트가 JSON을 보내는 경우 작동합니다. 내가 같은 문자열로 간단한 값을 보내고 있다면 some value, 다음 datanull입니다.
— brianestey

js 객체를 다시 보내도록 클라이언트 코드를 변경하십시오.
— George

크고 깨끗한 방법은 JSON 데이터를 얻을 수
— WOUTER Vanherck에게

json을 보내는 경우 var json = JsonConvert.SerializeObject (data);
— dvallejo

41

나는 사용 Postman하고 있었고 같은 실수를하고 있었다 .. value문자열 대신 as json 객체를 전달

{
    "value": "test"
}

api 매개 변수가 문자열 유형 인 경우 위의 내용이 잘못되었습니다 .

따라서 API 본문에서 문자열을 큰 따옴표로 묶습니다.

"test"

2
이것은 내 문제였으며 질문에 대한 실제 해결책 일 것입니다. JSON으로 인코딩 된 문자열에는 따옴표가 있습니다
— Kyle W

1
Postman 에서도이 문제가 발생했습니다. Content-Type이 application / json으로 설정된 경우 본문에 대해 "raw"대신 "form-data"를 잘못 선택한 것으로 나타났습니다. aspnet Github 문제 : github.com/aspnet/Home/issues/2202
— Chun Lin

이것은 나를 위해 일했습니다. Swagger (swashbuckle)를 사용하여 Content Type : application / json을 설정하고 큰 따옴표를 사용해야합니다.
— 존 헨켈

1
정확히 내 문제 그러나 Ajax 요청에서는 'data : JSON.stringify ( "YourString")'을 수행해야합니다.
— Amir Hossein Ahmadi

1
@AmirHosseinAhmadi 난 그냥 아약스 실제로 사용하는 것을보고에서이 발생했을 JSON.stringify나의 일으키는 [frombody]것으로 null. 데이터 필드를 문자열 값 (즉, json 문자열)으로 설정 한 후 작동했습니다.
— Nexaspx

19

데이터 모델로 사용할 클래스를 만든 다음 데이터 모델 클래스의 속성과 일치하는 속성을 가진 JSON 객체를 보냅니다. (참고 : 이것을 테스트했으며 오늘 방금 다운로드 한 최신 MVC 4 RC 2012에서 작동합니다).

public HttpResponseMessage Post(ValueModel model)
{
    return Request.CreateResponse<string>(HttpStatusCode.OK, "Value Recieved: " + model.Value);
}

public class ValueModel
{
    public string Value { get; set; }
}

아래 JSON 객체는 HTTP-POST 본문으로 전송되며 콘텐츠 유형은 application / json입니다.

{ "value": "In MVC4 Beta you could map to simple types like string, but testing with RC 2012 I have only been able to map to DataModels and only JSON (application/json) and url-encoded (application/x-www-form-urlencoded body formats have worked. XML is not working for some reason" }

데이터 모델 클래스를 만들어야하는 이유는 간단한 값이 url 매개 변수에서 온 것으로 가정하고 단일 복합 값은 본문에서 온 것으로 가정하기 때문입니다. 그들은 [FromBody]및 [FromUrl]속성을 가지고 있지만[FromBody] string value 여전히 하지 못했습니다. 그들이 여전히 많은 버그를 해결하고있는 것 같습니다. 그래서 앞으로 이것이 변경 될 것이라고 확신합니다.

편집 : 본문에서 작동하도록 XML이 있습니다. 기본 XML serializer는 XmlSerializer 대신 DataContractSerializer로 변경되었습니다. Global.asax 파일에 다음 줄을 넣으면이 문제가 해결되었습니다 ( 참조 )

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;

이것은 request.ContentType = "application / json; charset = UTF-8";
— Arvind Krmar

15

일부 시도 후 기본 동작이 정확하고 해킹 할 것이 없다고 생각합니다.

유일한 트릭은 : post 메소드 인수가 string아래와 같으면 본문에 큰 따옴표 가 있는 일반 문자열을 보내야 합니다 (ajax 또는 postman을 사용하는 경우).

//send "{\"a\":1}" in body to me, note the outer double quotes
[HttpPost("api1")]
public String PostMethod1([FromBody]string value)
{
    return "received " + value; //  "received {\"a\":1}"
}

그렇지 않으면 외부 큰 따옴표없이 이스케이프 된 내부 따옴표 없이 포스트 본문에 json 문자열을 보내면 모델 클래스 (인수 유형)로 구문 분석 할 수 있어야합니다.{"a":1, "b":2}

public class MyPoco{
    public int a;
    public int b;
}

//send {"a":1, "b":2} in body to me
[HttpPost("api2")]
public String PostMethod2([FromBody]MyPoco value)
{
    return "received " + value.ToString();  //"received your_namespace+MyPoco"
}

11

몇 분 동안이 문제에 대한 해결책을 찾고 있었으므로 솔루션을 공유 할 것입니다.

모델을 게시하면 모델에 빈 / 기본 생성자가 있어야합니다. 그렇지 않으면 모델을 만들 수 없습니다. 리팩토링하는 동안주의하십시오. ;)


리팩토링은 팁을 주셔서 감사합니다.
— Alan

10

이것은 나를 위해 일했다 :

  1. jQuery / Ajax에서 전달하려는 모든 속성에 대한 특성을 사용하여 C # DTO 클래스를 작성하십시오.

    public class EntityData
    {
        public string Attr1 { get; set; }
        public string Attr2 { get; set; }
    }
  2. 웹 API 방법을 정의하십시오.

    [HttpPost()]
    public JObject AddNewEntity([FromBody] EntityData entityData)
    {
  3. 다음과 같이 웹 API를 호출하십시오.

    var entityData = {
        "attr1": "value1",
        "attr2": "value2"
    };
    
    $.ajax({
        type: "POST",
        url: "/api/YOURCONTROLLER/addnewentity",
        async: true,
        cache: false,
        data: JSON.stringify(entityData),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
            ...
        }
    });

이것을 게시 해 주셔서 감사합니다, 나는 많은 샘플을 시도했지만 이것은 나를 위해 일했습니다!
— Satbir

10

Swagger 또는 Postman 과 동일한 문제가있는 사람들의 경우 "ContentType"이 지정된 경우에도 게시물에서 문자열로 간단한 속성을 전달하는 경우 여전히 null 값을 얻습니다.

그냥 전달 :

MyValue

컨트롤러에서 null로 가져옵니다.

그러나 통과하면 :

"MyValue"

가치가 올 것이다.

인용문은 여기서 차이를 만들었습니다. 물론 이것은 Swagger와 Postman만을위한 것입니다. 예를 들어 Angular를 사용하는 프론트 엔드 앱에서는 프레임 워크가이를 자동으로 해결해야합니다.


6

나는 같은 문제가 있었고 콘텐츠 유형을 "application / json"으로 변경해도 문제가 해결되지 않는다는 것을 알았습니다. 그러나 "application / json; charset = utf-8"이 작동했습니다.


예, 웹 API는 charset = utf-8없이 직렬화 해제하지 않습니다. blog.codenamed.nl/2015/05/12/…
— Sam Rueby

4

내 웹 API 메소드의 요청 객체가 항상 null 인 것과 비슷한 문제가있었습니다. 컨트롤러 작업 이름 앞에 "Get"이 붙었 기 때문에 Web API는 이것을 POST가 아닌 HTTP GET으로 취급했습니다. 컨트롤러 작업의 이름을 바꾼 후 이제 의도 한대로 작동합니다.


3

Angular를 사용하면 다음 형식으로 데이터를 전달할 수있었습니다.

 data: '=' + JSON.stringify({ u: $scope.usrname1, p: $scope.pwd1 }),
 headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' }

그리고 Web API Controler에서 :

    [HttpPost]
    public Hashtable Post([FromBody]string jsonString)
    {
        IDictionary<string, string> data = JsonConvert.DeserializeObject<IDictionary<string, string>>(jsonString);
        string username = data["u"];
        string pwd = data["p"];
   ......

또는 JSON 데이터를 다음과 같이 게시 할 수도 있습니다.

    data: { PaintingId: 1, Title: "Animal show", Price: 10.50 } 

그리고 컨트롤러에서 다음과 같은 클래스 유형을 수락하십시오.

    [HttpPost]
    public string POST(Models.PostModel pm)
    {

     ....
    }

API에 공개 클래스가 있으면 JSON을 게시하고 그렇지 않으면 '='+ JSON.stringify ({.. : ..., .. : ...})를 게시하십시오.


3

필자의 경우 문제는 매개 변수가 문자열이고 객체가 아니라는 것입니다. 매개 변수를 Newsoft.Json의 JObject로 변경하면 작동합니다.


2

라인 추가

        ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());

protected void Application_Start()Global.asax.cs 의 기능 끝까지 ASP.NET MVC3에서 비슷한 문제가 해결되었습니다.


도움을 주셔서 감사하지만 불행히도 도움이되지 않았습니다. 어쨌든 도움이 될 수 있으므로 한동안 라인을 유지하겠습니다!
— ianrathbone

XML을 게시 할 때 동일한 문제를 추가하는 것만
— ianrathbone

2

Xml Formatter 또는 JSON Formatter에 DataContractSerializer 를 사용하는 경우 이를 제거해야합니다. 내 WebApiConfig 파일에 이것을 가지고 있습니다.

public static void Register(HttpConfiguration config)
{
     config.Routes.MapHttpRoute(
           name: "DefaultApi",
           routeTemplate: "api/{controller}/{id}",
           defaults: new { id = RouteParameter.Optional }
     );    

     var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
     jsonFormatter.UseDataContractJsonSerializer = true;
}

간단히 주석 처리하고 jsonFormatter.UseDataContractJsonSerializer = true;입력 매개 변수가 더 이상 null이 아닙니다. 실마리를 주신 'Despertar'에게 감사합니다.


2

전송 된 JSON이 확실하다면 API를주의해서 추적해야합니다.

  1. Microsoft.AspNet.WebApi.Tracing패키지 설치
  2. 추가 config.EnableSystemDiagnosticsTracing();에서 WebApiConfig클래스 내부의 Register방법.

이제 디버그 출력을 보면 유효하지 않은 ModelState로그 항목을 찾을 수 있습니다.

ModelState유효하지 않은 경우 실제 원인을 찾을 수 있습니다 Errors.

아무도 그런 예외를 추측 할 수 없습니다.

Could not load file or assembly 'Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

당신은 내 생명을 구했습니다. 모델로 null을 가져오고 패키지를 설치 한 후 JSON이 올바른 형식이 아님을 발견했습니다.
— Khizar Iqbal

2

매개 변수로 null을 얻는 것과 동일한 문제가 있었지만 큰 객체와 관련이 있습니다. 문제는 IIS 최대 길이와 관련이 있다는 것이 밝혀졌습니다. web.config에서 구성 할 수 있습니다.

  <system.web>
    <httpRuntime targetFramework="4.7" maxRequestLength="1073741824" />
  </system.web>

왜 Web API가 오류를 억제하고 null 객체를 API로 보냅니다. Microsoft.AspNet.WebApi.Tracing을 사용하여 오류를 발견했습니다.



1

나는 이것이이 질문에 대한 답이 아니라는 것을 알고 있지만 내 문제에 대한 해결책을 찾을 때 그 문제를 발견했습니다.

내 경우에는 복잡한 유형이 바인딩되지 않았지만 POST를 수행하지 않고 쿼리 문자열 매개 변수로 GET을 수행했습니다. 해결책은 [FromUri]를 arg에 추가하는 것입니다.

public class MyController : ApiController
{
    public IEnumerable<MyModel> Get([FromUri] MyComplexType input)
    {
        // input is not null as long as [FromUri] is present in the method arg
    }
}

GET을 사용할 때 요청 본문이 무시 되고 때로는 오류가 발생하기 때문입니다. 지금 작동하는 이유는 B / 당신은 지금 쿼리 문자열에 PARAMS을 전달하고, 몸이 비어는 C 는 GET에 있어야로
— RyBolt

1

피들러에서도 같은 문제가있었습니다. 요청 헤더 가 이미 Content-Type: application/json; charset=utf-8있거나 Content-Type: application/json있습니다.

내 요청 본문도 일반 문자열이었고 Fiddler에서 나는 다음과 같이 썼습니다 {'controller':'ctrl'}. 이것은 내 POST 메소드의 문자열 매개 변수를으로 만들었습니다 null.

수정 : 따옴표를 사용하여 문자열을 나타냅니다. 즉, 글을 써서 고쳤습니다 "{'controller':'ctrl'}". (참고 : JSON을 작성할 때 아포스트로피를 사용하거나 다음과 같이 따옴표를 이스케이프하십시오 :) "{\"controller\":\"ctrl\"}".


우편 배달부에서 같은 일을해야했습니다. 그러나 Spring 서비스를 호출 할 때이 작업을 수행 할 필요가 없습니다. .Net 측의 문제처럼 보입니다.
— Malcolm McRoberts

1

MVC 6에 전달하는 간단한 JSON 객체를 처리하는 가장 간단한 방법은 NewtonSoft jObject와 같은 post 매개 변수의 유형을 얻는 것입니다.

public ActionResult Test2([FromBody] jObject str)
{
        return Json(new { message = "Test1 Returned: "+ str }); ;
}

JObject에 바디를 캐스트하기 전에 [FromBody] object body, [FromHeader(Name="Content-Type")] string bodyMediaType확인 bodyMediaType == "application.json"하는 것이 대체를위한 기회를 제공하므로 Test ( )가 더 잘 작동 할 수 있습니다 .
— VladH

1

나에게 가장 좋은 해결책은 다음과 같이 전체 HTTP를 사용하는 것입니다.

[Route("api/open")]
[HttpPost]
public async Task<string> open(HttpRequestMessage request)
{
    var json = await request.Content.ReadAsStringAsync();
    JavaScriptSerializer jss = new JavaScriptSerializer();            
    WS_OpenSession param = jss.Deserialize<WS_OpenSession>(json);
    return param.sessionid;
}

그런 다음 포스트 본문에서 예상되는 객체로 문자열을 역 직렬화합니다. 나에게 WS_OpenSession은 sessionid, user 및 key를 포함하는 클래스입니다.

거기에서 param 객체를 사용하여 해당 속성에 액세스 할 수 있습니다.

매우 효과적입니다.

나는이 URL에서 유래했다고 말했다 :

http://bizcoder.com/posting-raw-json-to-web-api


1

복잡한 유형의 경우 Web API는 매체 유형 포맷터를 사용하여 메시지 본문에서 값을 읽으려고합니다.

당신이 있는지 확인하십시오 [Serializable]모델 클래스를 장식 속성 .

작동하는지 확인하려면 속성을 제거하십시오. 이것은 나를 위해 일했습니다.


1

나는 파티에 조금 늦었지만 컨트롤러를 사용할 때 NULL 값을 우연히 만난 사람은 POST 요청 앞에 "="를 추가하면됩니다.

application / json Content-Type을 사용할 때 컨트롤러도 NULL 값을 전달했습니다 . 아래의 "application / x-www-form-urlencoded"컨텐츠 유형을 참고하십시오. 그러나 API의 리턴 유형은 "application / json"입니다.

 public static string HttpPostRequest(string url, Dictionary<string, string> postParameters)
    {
        string postData = "=";

        foreach (string key in postParameters.Keys)
        {
            postData += HttpUtility.UrlEncode(key) + "="
                  + HttpUtility.UrlEncode(postParameters[key]) + ",";
        }

        HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
        myHttpWebRequest.Method = "POST";

        byte[] data = System.Text.Encoding.ASCII.GetBytes(postData);

        myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
        myHttpWebRequest.ContentLength = data.Length;

        Stream requestStream = myHttpWebRequest.GetRequestStream();
        requestStream.Write(data, 0, data.Length);
        requestStream.Close();

        HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();

        Stream responseStream = myHttpWebResponse.GetResponseStream();

        StreamReader myStreamReader = new StreamReader(responseStream, System.Text.Encoding.Default);

        string pageContent = myStreamReader.ReadToEnd();

        myStreamReader.Close();
        responseStream.Close();

        myHttpWebResponse.Close();

        return pageContent;
    }

1

게시하려는 값 유형은 중요하지 않으며 따옴표로 묶어 문자열로 가져옵니다. 복잡한 유형에는 적합하지 않습니다.

자바 스크립트 :

    var myData = null, url = 'api/' + 'Named/' + 'NamedMethod';

    myData = 7;

    $http.post(url, "'" + myData + "'")
         .then(function (response) { console.log(response.data); });

    myData = "some sentence";

    $http.post(url, "'" + myData + "'")
         .then(function (response) { console.log(response.data); });

    myData = { name: 'person name', age: 21 };

    $http.post(url, "'" + JSON.stringify(myData) + "'")
         .then(function (response) { console.log(response.data); });

    $http.post(url, "'" + angular.toJson(myData) + "'")
         .then(function (response) { console.log(response.data); });

씨#:

    public class NamedController : ApiController
    {
        [HttpPost]
        public int NamedMethod([FromBody] string value)
        {
            return value == null ? 1 : 0;
        }
    }

1

[FromBody] 주석을 입력 한 후 메소드의 매개 변수로 Dto 오브젝트가 있고 여전히 데이터를 가져올 수없는 경우 DTO의 특성 및 필드를 살펴보십시오.

DTO가 무효화되는 동일한 문제가 발생했습니다. 그 이유 중 하나는 속성 중 하나 가 직렬화 할 수없는 객체를 가리키고 있었기 때문입니다.


1

데이터 유형을 다시 확인하십시오. 닷넷 모델 바인더는 float를 정수로 변환하지 않습니다 (그리고 다른 관련 개념을 가정하고 있습니다). 이로 인해 전체 모델이 거부됩니다.

다음과 같이 json이있는 경우 :

{
    "shoeSize": 10.5
}

그러나 C # 모델은 다음과 같습니다.

class Shoe{
    public int shoeSize;
}

모델 바인더는 모델을 거부하고 null을 얻습니다.


1

나는 이것에 꽤 늦었지만 비슷한 문제가 있었고 하루 동안 많은 대답을 겪고 배경을 얻은 후 하나 이상의 매개 변수를 Web API에 다시 전달하는 가장 쉬운 경량 솔루션을 발견했습니다. 다음과 같습니다 :

https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with를 참조하지 않으면 올바른 라우팅으로 웹 API 컨트롤러 / 액션을 설정하는 방법을 알고 있다고 가정합니다. -aspnet-web-api / tutorial-your-first-web-api .

먼저 컨트롤러 작업 인이 솔루션에는 Newtonsoft.Json 라이브러리도 필요합니다.

[HttpPost]
public string PostProcessData([FromBody]string parameters) {
    if (!String.IsNullOrEmpty(parameters)) {
        JObject json = JObject.Parse(parameters);

        // Code logic below
        // Can access params via json["paramName"].ToString();
    }
    return "";
}

jQuery를 사용하는 클라이언트 측

var dataToSend = JSON.stringify({ param1: "value1", param2: "value2"...});
$.post('/Web_API_URI', { '': dataToSend }).done(function (data) {
     console.debug(data); // returned data from Web API
 });

내가 찾은 주요 문제는 단일 전체 매개 변수 만 웹 API로 다시 보내고 이름 만 값이 없는지 확인하는 것이 었습니다. { '': dataToSend } 것입니다. 그렇지 않으면 서버 측에서 값이 null이됩니다.

이를 통해 JSON 구조에서 하나 이상의 매개 변수를 웹 API에 보낼 수 있으며 복잡한 데이터를 처리하기 위해 서버 측에 추가 오브젝트를 선언 할 필요가 없습니다. 또한 JObject를 사용하면 전달 된 모든 매개 변수를 동적으로 반복하여 매개 변수가 시간이 지남에 따라 변경되는 경우 더 쉽게 확장 할 수 있습니다. 잘하면 그것은 나처럼 고생하고있는 누군가를 도울 수 있습니다.


0

본문의 단일 매개 변수를 WebAPI에 올바르게 전달하면이 코드가 작동합니다. $.post(url, { '': productId }

그리고 실제로 잡기 [HttpPost] public ShoppingCartAddRemoveViewModel Delete([FromBody]string value)

핵심은 마법의 단어 '값'을 사용하는 것입니다. 또한 int이거나 일부 기본 유형일 수 있습니다. 내용 유형 또는 헤더 수정에 상관없이 Mess는이 코드가 mvc post action에서 작동하지 않는다는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.