2012-01-21 5 views
1

サンプルASP.NET MVC 3アプリケーションを使用しています。私は、私が取り組んでいるプロジェクトのために、HttpWebRequestを使用してログイン要求を送信することで、APIの概念実証に取り組んでいます。私はJSONとしてデータを提出しており、コンテンツタイプ "application/json"を使用しています。ここでModelStateにすべての必須値が含まれていても、DefaultModelBinderはバインディングモデルではありません(常にnull)

は、私が持っているメソッドです。

[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; 
} 

問題はModelStateは、私が見ることを期待し、すべてのキーと値が含まれていても(例えば辞書 "、{「ユーザー名」=「ユーザ名」が含まれていることですLogOnModelクラスの3つのプロパティである "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/

ポイントは、ビュー(私たちのWebページ用)とJSON結果(API呼び出し用)の両方を持つメソッドを使用できるようなものでした。もし誰かがこれについての他のアイデアを持っていれば(明白なif-return-view-else-return-jsonを除いて)、以下にコメントしてください。私はそれらを聞いています。

関連する問題