1

サンプルのASP.NETMVC3アプリケーションを使用しています。を使用してログイン要求を送信することにより、作業中のプロジェクトのAPIの概念実証に取り組んでいますHttpWebRequest。データをJSONとして送信し、コンテンツタイプ「application/json」を使用しています。

これが私が持っている方法です:

[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(たとえば、Dictionaryには{"UserName" = "username"、 "Password" = "password"、 "RememberMe"=true}が含まれていることです。 LogOnModelクラス)、modelメソッドを呼び出すたびにオブジェクトはnullになります。

「application/x-www-form-urlencoded」を使用する場合、この問題は発生しません。私も追加して、追加せずに試しました

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

私のApplication_Start方法に。

上記のメソッドにリクエストを送信するために使用しているコードは次のとおりです。

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); }
 }
4

1 に答える 1

1

[Api]属性を削除すると問題が解決したことがわかりました。誰かが興味を持っているなら、それはこのURLから来ました:http://mvcapi.codeplex.com/

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

于 2012-01-21T21:53:11.070 に答える