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 프로젝트에서도 동일한 문제가 발생합니다.
답변
하나의 매개 변수 만 있으므로 [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
답변
나는 오늘 이것에 대해 머리를 긁었다.
내 솔루션은 변화하는 [FromBody]
A를 HttpRequestMessage
기본적으로 HTTP 스택을 이동.
제 경우에는 유선을 통해 데이터를 전송하고 압축 된 json은 base64입니다. 이 모든 것이 안드로이드 앱에서 제공됩니다.
내 웹 엔드 포인트의 원래 서명은 다음과 같습니다 (사용 [FromBody]
).
이 문제에 대한 나의 픽스는 HttpRequestMessage
엔드 포인트의 서명 을 사용하여 되 돌리는 것이었다 .
그런 다음이 코드 줄을 사용하여 게시물 데이터에 액세스 할 수 있습니다.
이것은 작동하며 손대지 않은 원시 포스트 데이터에 액세스 할 수있게합니다. 피들러가 문자열의 시작 부분에 = 기호를 넣거나 내용 유형을 변경하는 것을 망칠 필요가 없습니다.
따로, 나는 먼저 컨텐츠 유형을 “Content-Type : application / x-www-form-urlencoded”로 변경하는 위의 답변 중 하나를 따르려고했습니다. 원시 데이터의 경우 + 문자를 제거하므로 좋지 않은 조언입니다.
따라서 다음과 같이 시작하는 base64 문자열 : “MQ0AAB + LCAAAAAA”는 “MQ0AAB LCAAAAAA”와 같이 끝납니다! 당신이 원하는 것이 아닙니다.
사용의 또 다른 이점은 HttpRequestMessage
엔드 포인트 내에서 모든 http 헤더에 액세스 할 수 있다는 것입니다.
답변
Fiddler를 사용하여 방금 발생했습니다. 문제는 내가 지정하지 않았다는 것 Content-Type
입니다.
Content-Type
POST 요청에 헤더를 포함 하십시오.
Content-Type: application/x-www-form-urlencoded
또는 아래 의견에 따라 JSON 헤더를 포함해야 할 수도 있습니다
Content-Type: application/json
답변
나는이 문제에 부딪 쳤으며 이것이 내 문제를 해결하는 방법입니다.
webapi 코드 :
public void Post([FromBody] dynamic data)
{
string value = data.value;
/* do stuff */
}
클라이언트 코드 :
$.post( "webapi/address", { value: "some value" } );
답변
나는 사용 Postman
하고 있었고 같은 실수를하고 있었다 .. value
문자열 대신 as json 객체를 전달
{
"value": "test"
}
api 매개 변수가 문자열 유형 인 경우 위의 내용이 잘못되었습니다 .
따라서 API 본문에서 문자열을 큰 따옴표로 묶습니다.
"test"
답변
데이터 모델로 사용할 클래스를 만든 다음 데이터 모델 클래스의 속성과 일치하는 속성을 가진 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;
답변
일부 시도 후 기본 동작이 정확하고 해킹 할 것이 없다고 생각합니다.
유일한 트릭은 : 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"
}