2015-12-19 5 views
2

Я создаю форму входа в систему с использованием модели MVC. На самом деле, мое приложение может правильно установить GET, DELETE и даже POST (Create). Когда я пытался использовать метод POST для отправки объекта JSON в мой метод входа, генерируется исключение «Bad Request».Неверный запрос Исключение вызывается при загрузке объекта JSON с использованием метода POST

Вот код, чтобы прояснить мой вопрос: В классе 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 где я реализовать метод Логин, который будет загружать объект 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\"}"

На моей стороне сервера здесь приведен метод входа. Следующий метод в 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 имеют одно и то же тело в классе модели. Я также использую метод POST, потому что некоторые данные должны быть скрыты, например, пароль. Но строка загрузки не может загрузить данные (строка JSON). Когда я показываю строку данных, она содержит нужные мне данные, поэтому она не пустая.

ответ

0

UploadString переносит JSON в кавычки, так как обрабатывает его как строку. Поэтому, когда данные попадают в контроллер входа, контроллер ищет десериализацию модели из тела, которая состоит из строки вместо json-объекта. Поскольку он не может десериализовать модель User из одной строки, она терпит неудачу.

Исходное исправление должно было бы использовать один из других способов загрузки WebClient, например UploadData.

 Смежные вопросы

  • Нет связанных вопросов^_^