我正在使用示例ASP.NET MVC 3应用程序。我正在为我正在进行的项目为API进行概念验证,通过使用HttpWebRequest
s发送登录请求。我将数据提交为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());
到我的CCD_ 4方法。
这是我用来向上面的方法发送请求的代码:
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); }
}
事实证明,删除[Api]属性解决了我的问题。如果有人感兴趣,它来自这个网址:http://mvcapi.codeplex.com/
关键是我们可以使用同时具有Views(用于我们的网页)和JSON结果(用于API调用)的方法。如果有人对此有任何其他想法(除了显而易见的如果这个返回视图else返回json),请随时在下面发表评论,我很想听听他们的意见。