2012-01-21 3 views
1

예제 ASP.NET MVC 3 응용 프로그램을 사용하고 있습니다. 내가 작업중인 프로젝트의 API에 대한 개념 증명을 위해 HttpWebRequest을 사용하여 로그인 요청을 보내고 있습니다. JSON으로 데이터를 제출하고 "Application/json"이라는 컨텐트 유형을 사용하고 있습니다.ModelState에 모든 필수 값이 포함되어 있어도 DefaultModelBinder 바인딩 모델이 아닙니다. (항상 null입니다.)

문제는 비록 ModelState 내가 볼 것으로 예상 모든 키와 값을 포함하고 있다는 점이다
[HttpPost] 
[Api] 
public bool ApiLogOn(LogOnModel model) 
{ 
    if (ModelState.IsValid && model != null) 
    { 
     if (Membership.ValidateUser(model.UserName, model.Password)) 
     { 
      FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 
      return true; 
     } 
    } 

    return false; 
} 

(예 : 사전 { "사용자 이름"= "사용자 이름"을 포함, "여기

는 내가 가지고있는 방법이다 LogOnModel 클래스의 세 가지 속성 인 "Password"= "password", "RememberMe"= true}) 메서드를 호출 할 때마다 객체 model이 null입니다.

"application/x-www-form-urlencoded"를 사용할 때이 문제가 발생하지 않습니다. 또한 내 Application_Start 방법

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

를 추가하지 않고 및 을 시도했습니다.

var credentials = new LogOnModel() { UserName = "username", Password = "password", RememberMe = true }; 
var result = PostData<LogOnModel, bool>(@"url goes here", credentials); 

protected R PostData<T, R>(string uri, T postData) 
{ 
    var request = WebRequest.Create(uri) as HttpWebRequest; 
    request.Headers.Add("X-Requested-With", X_REQUESTED_WITH_HEADER); 
    request.Accept = "application/json"; 
    request.Method = "POST"; 
    request.CookieContainer = cookieJar; 
    request.ContentType = "application/json"; 

    var serializerT = new DataContractJsonSerializer(typeof(T)); 
    var serializerR = new DataContractJsonSerializer(typeof(R)); 

    if (postData != null) 
    { 
     using (var stream = request.GetRequestStream()) 
     { 
      serializerT.WriteObject(stream, postData); 
     } 
    } 

    try 
    { 
     var response = request.GetResponse() as HttpWebResponse; 

     if (response.StatusCode == HttpStatusCode.OK) 
     { 
      using (var stream = response.GetResponseStream()) 
      { 
       var result = (R)serializerR.ReadObject(stream); 
       return result; 
      } 
     } 
     else 
     { 
      return default(R); 
     } 
    } catch { return default(R); } 
} 
+0

'[Api]'속성은 무엇입니까? 그것은 표준이 아닙니다. 당신이 쓴 몇 가지 맞춤 동작 필터입니까? 이 속성없이 코드를 테스트 한 결과 완벽하게 정상적으로 작동했습니다. 또한 ASP.NET MVC 컨트롤러 작업에서 부울을 반환하는 이유는 무엇입니까? 그들은 ActionResults를 반환해야합니다. 귀하의 경우 그것은 JsonResult가 될 것입니다. –

+0

흥미 롭습니다. 실제로 Api 속성을 제거하면 실제로 문제가 해결되는 것 같습니다. http://mvcapi.codeplex.com/에서 제공됩니다. 이제 이것을 허용 된 대답으로 게시 하겠지만 그 속성이 문제를 일으키는 이유를 살펴 보겠습니다. –

답변

1

그것은 [API 광고] 속성을 제거하면 내 문제를 해결 밝혀 : 여기

내가 위의 방법으로 요청을 보낼 사용하고있는 코드입니다. 누구나 관심이 있다면,이 URL에서 온 것입니다 : http://mvcapi.codeplex.com/

요점은 뷰 (웹 페이지 용)와 JSON 결과 (API 호출 용)를 모두 가지고있는 메소드를 사용할 수 있다는 것이 었습니다. 다른 사람이이 아이디어를 가지고 있다면 (명백한 if-this-return-view-else-return-json을 제외하고) 자유롭게 아래에 언급 할 것이고, 나는 그것들을 듣고 싶다.