使用POST方法上载JSON对象时抛出错误请求异常

时间:2015-12-19 04:11:11

标签: c# json http-post wcf-rest

我正在使用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字符串)。当我显示数据字符串时,它包含我需要的数据,所以它不是空的。

1 个答案:

答案 0 :(得分:0)

UploadString将JSON包装在引号中,因为它将其视为字符串。因此,当数据到达登录控制器时,控制器正在寻找从主体反序列化模型,该模型由字符串而不是json对象组成。由于它无法从单个字符串反序列化用户模型,因此失败。

最简单的解决方法是使用其他WebClient上传方法之一,例如UploadData