我正在使用MVC模型创建登录表单。实际上,我的应用程序可以正确获取,删除甚至POST(创建)。当我尝试使用POST方法在Login方法中发送JSON对象时,会抛出“Bad Request”异常。
以下是一些清理我的问题的代码: 在 LoginController 类中,我按如下方式实现了登录方法:
[HttpPost]
public ActionResult Login(LoginViewModel lvm)
{
LoginServiceClient lsc = new LoginServiceClient();
bool userFound_flag = lsc.Login(lvm.User);
if (userFound_flag)
return RedirectToAction("Index_User", lvm.User);
else
return RedirectToAction("Create");
}
}
在Model文件夹中,这个类 LoginServiceClient 是我实现Login方法的地方,它将按如下方式上传JSON对象:
public bool Login(User user)
{
try
{
var webClient = new WebClient();
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(User));
MemoryStream mem = new MemoryStream();
ser.WriteObject(mem, user);
string data = Encoding.UTF8.GetString(mem.ToArray(), 0, (int)mem.Length);
webClient.Headers["Content-type"] = "application/json";
webClient.Encoding = Encoding.UTF8;
String str = webClient.UploadString(BASE_URL + "login", "POST", data);
return true;
}
catch (WebException webEx)
{
return false;
}
}
如您所见,行String str = webClient.UploadString(BASE_URL + "login", "POST", data);
是引发异常的地方。此函数与我用于在数据库中创建新对象的Create函数相同。字符串数据例如是"\"City\":null,\"Country\":null,\"Email\":null,\"FirstName\":null,\"Gender\":null,\"Id\":0,\"LastName\":null,\"Password\":\"EEPass\",\"Telephone\":0,\"UserName\":\"EE\"}"
在我的服务器端,这是Login方法。以下方法位于 IloginService.cs 类中:
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "login", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
User Login(User _user);
在 LoginSerive.svs.cs 类中,我连接到我的数据库:
public User Login(User _user)
{
using (OnlineStoreDBEntities ose = new OnlineStoreDBEntities())
{
return ose.UserEntities.Where(pe => pe.Username == _user.UserName && pe.Password == _user.Password).Select(pe => new User
{
Id = pe.Id,
Email = pe.Email,
FirstName = pe.FirstName,
LastName = pe.LastName,
//Telephone = Convert.ToInt32(pe.Telephone),
Country = pe.Country,
City = pe.City,
//Gender = Convert.ToInt32(pe.Gender)
}).First();
};
}
最后,为了确保我清楚,Create和Login函数在Model类中具有相同的主体。我也使用POST方法,因为应该隐藏一些数据,例如密码。但上传字符串无法上传数据(JSON字符串)。当我显示数据字符串时,它包含我需要的数据,所以它不是空的。
答案 0 :(得分:0)
UploadString
将JSON包装在引号中,因为它将其视为字符串。因此,当数据到达登录控制器时,控制器正在寻找从主体反序列化模型,该模型由字符串而不是json对象组成。由于它无法从单个字符串反序列化用户模型,因此失败。
最简单的解决方法是使用其他WebClient
上传方法之一,例如UploadData
。