게시물 매개 변수는 항상 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.