12

JSON 데이터를 Web API 메소드로 POST하려고하지만 JSON 데이터가 모델에 바인딩되어 있지 않습니다.ASP.Net 웹 Api가 POST에서 바인딩 모델이 아닙니다.

[DataContract] 
public class RegisterDataModel 
{ 
    [DataMember(IsRequired = true)] 
    public String SiteKey { get; set; } 

    [DataMember(IsRequired = true)] 
    public String UserId { get; set; } 

    [DataMember(IsRequired = true)] 
    public String UserName { get; set; } 
} 

가 여기 내 웹 API 조치입니다 : 내가 [ModelBinder를] 추가하기 전에

public class RegisterController : ApiController 
    { 
    public Guid Post([ModelBinder] RegisterDataModel registerDataModel) 
    { 
     if (!ModelState.IsValid) 
     { 
      throw new ModelStateApiException(ModelState); 
     } 
     var userProfileDataContract = userProfileBusinessLibrary.GetNewOne(); 
     userProfileDataContract.UserId = registerDataModel.UserId; 
     userProfileDataContract.UserName = registerDataModel.UserName; 

     var userKey = userProfileBusinessLibrary.Register(registerDataModel.SiteKey, userProfileDataContract); 

     return userKey; 
    } 
    } 

이 registerDataModel가 null이었다

여기 내 모델입니다. [ModelBinder]를 추가 한 후, registerDataModel은 RegisterDataModel 인스턴스이지만 모든 속성 값은 null입니다.

http://local.testwebsite.com/api/register 

Request Headers: 
User-Agent: Fiddler 
Host: local.testwebsite.com 
Content-Length: 89 
Content-Type: application/json; charset=utf-8: 

Request Body: 
{ 
"SiteKey":"qwerty", 
"UserId": "12345qwerty", 
"UserName":"john q" 
}  

내가이 RegisterDataModel 속성에 내 게시물 데이터 바인딩을 만들기 위해 실종 :

여기 피들러를 통해 내 요청입니까? 당신의 도움을 주셔서 감사합니다.

+0

컨트롤러 동작에'[Post]'속성이 필요할 수도 있습니다. – McGarnagle

+1

답장을 보내 주셔서 감사합니다.하지만 [HttpPost]를 추가해도 도움이되지 않았습니다. ASP.net MVC가 동사를 컨트롤러 동작과 일치시키는 규칙을 사용하기 때문에 http 동사 특성이 필요하지 않다는 것을 WebApi에서 알고 있습니다. –

답변

10

JSON 요청을 어떻게 작성하고 있습니까? Fiddler 요청 빌더를 통해? 요청 본문에서 다음을 시도하십시오.

{ 
"SiteKey":"qwerty", 
"UserId": "12345qwerty", 
"UserName":"john q" 
} 

'요청 본문 :'은 요청 본문의 일부이기도합니다. 그것을 제거하고 확인하십시오.

+0

피들러 (Fiddler)의 작곡가를 사용하여 json 데이터를 웹 API에 제출합니다. 스크린 샷은 다음과 같습니다. http://screencast.com/t/x2IH6hp01rGQ –

+0

[ModelBinder]를 제거하면 완벽하게 작동합니다. 난 그냥 당신의 코드를 붙여 넣기 복사하고 그것을 테스트했습니다. 내가 여기서 보게되는 한 가지 차이점은 길이가 89 인 콘텐츠입니다. 동일한 페이로드의 경우 광산이 64입니다. 그래서 'Request Body :'와 같은 뭔가를 보내고있는 것 같습니다. – Badri

+4

아, btw, utf-8 옆에 콜론 또는 세미콜론이 있습니다. Content-Type : application/json; charset = utf-8 : 제거하고 시도하십시오 – Badri

11

은 영업 이익의 문제와 관련,하지만 난 (공개) 필드 대신 속성 모델 클래스의 (즉, 더 {get; set;})를 사용할 때 문제 의 제목이 날 여기지도 않습니다. 이렇게하면 바인딩이 실패하게됩니다.

아마도 도움이 될 것입니다.

+1

나는 똑같은 문제가 있었고 get과 set을 추가하여 이것을 해결했다. –

+1

이것은 나를 도왔습니다. 그것이 삭제되지 않았다는 것을 알았 기 때문에 다행스럽게도 OP가 이미 속성을 가지고 있더라도이 질문 제목에 확실히 속합니다. –

+0

이것은 나를 도왔습니다. 고마워요! – pwaivers

0

필자의 경우, .NET 웹 API로 전달하기 전에 응용 프로그램의 요청이 인증/권한 부여를위한 "API 관리자"라는 미들웨어를 통과합니다. POST 매개 변수는 바인드되지 않습니다. 이유는 무엇인지 모르겠지만 "Content-Length"가 Headers에서 나옵니다. 이유는 기본 JsonMediaTypeFormatter가 모델 바인딩을 수행하기 전에 항상 Content-Length 요청을 확인하고, Content-Length가 표시되지 않으면 매개 변수를 NULL로 설정합니다.

관련 문제