2013-06-08 3 views
1

У меня проблема с моим приложением для веб-приложений. Я получаю внутреннюю ошибку 500, когда пытаюсь опубликовать (сохранить) нового пользователя в моем db. Ниже приведена функция, которую я использую для вызова клиента.Внутренняя ошибка 500 на POST web api

public void InsertNewUser(RegisterModel pNewUser, string pEmail) 
{ 
    // Build rest uri 
    string lREST_Uri_Browse = string.Format(@"api/accountapi/saveuserdata" 
    // User data 
    /*pModelSerialized*/); 

    // Complete URI 
    string lREST_Uri = Helpers_API.endPoint + lREST_Uri_Browse; 

    var client = new HttpClient(); 

    client.BaseAddress = new Uri(Helpers_API.endPoint); 

     var newUser = new Models.Models_API.Users 
     { 
      Email = pNewUser.Email, 
      FName = pNewUser.FName, 
      LName = pNewUser.LName, 
      Inserted = DateTime.Now, 
      ActiveAcc = true, 
      AccType = pNewUser.AccType, 
      BCompanyID = pNewUser.CompanyID, 
      PID = pNewUser.PID, 
      Password = pNewUser.Password, 
      Token = GetToken(pEmail), 
      ThirdParty = 0, 
      Gender = pNewUser.Gender, 
      BirthDate = pNewUser.BirthDate 
     }; 

     // Add an Accept header for JSON format. 
     //client.DefaultRequestHeaders.Accept.Add(
     // new MediaTypeWithQualityHeaderValue("application/json")); 
     // Create the JSON formatter. 
     MediaTypeFormatter jsonFormatter = new JsonMediaTypeFormatter(); 

     // Use the JSON formatter to create the content of the request body. 
     HttpContent content = new ObjectContent<Models.Models_API.Users>(newUser, jsonFormatter); 

     var result = client.PostAsync(lREST_Uri_Browse, content).Result; 
} 

Это модель

public class Users 
{ 
    public int BrokerID { get; set; } 
    public DateTime Inserted { get; set; } 
    public string Email { get; set; } 
    public string FName { get; set; } 
    public string LName { get; set; } 
    public bool ActiveAcc { get; set; } 
    public int BCompanyID { get; set; } 
    public int PID { get; set; } 
    public int AccType { get; set; } 
    public string Password { get; set; } 
    public string Token { get; set; } 
    public int Gender { get; set; } 
    public DateTime BirthDate { get; set; } 
    public int ThirdParty { get; set; } 
} 

И ниже является POST в APIController:

public HttpResponseMessage SaveUserData(Users pNewUser) 
    { 
     bool createUser = false; 
     // First check for provided email in DB 
     Users existingUser = asigCtx.Users.Where(u => u.Email == pNewUser.Email).SingleOrDefault(); 
     if (existingUser == null) 
      createUser = true; 
     else if (existingUser.ActiveAcc) 
      createUser = true; 

     if (createUser) 
     { 
      using (asigCtx = new AsigPrimeContext()) 
      { 
       Users user = new Users() 
       { 
        Email = pNewUser.Email, 
        FName = pNewUser.FName, 
        LName = pNewUser.LName, 
        Inserted = DateTime.Now, 
        ActiveAcc = true, 
        AccType = pNewUser.AccType, 
        BCompanyID = pNewUser.BCompanyID, 
        PID = pNewUser.PID, 
        Password = pNewUser.Password, 
        Token = pNewUser.Token, 
        ThirdParty = 0, 
        Gender = pNewUser.Gender, 
        BirthDate = pNewUser.BirthDate, 
       }; 

       asigCtx.Users.Add(user); 

       asigCtx.SaveChanges(); 
      } 
     } 
     var response = Request.CreateResponse<Users>(HttpStatusCode.Created, pNewUser); 
     return response; 
    } 

Может кто-нибудь дать мне совет с этим кодом, потому что я новичок в этом и я просто хочу это сделать. TNX

+0

Самое смешное, что в вызове после исполнения, когда код должен получать в качестве параметра модель, отправленную с клиента, этого не происходит. – Vlad

ответ

3

У вас есть ошибка в коде. Ошибка 500 указывает, что ваш код содержит необработанное исключение, которое убило его рабочий процесс.

Измените файл web.config так, чтобы ваше приложение выводило полное сообщение об ошибке.

+0

Получается ошибка в первой части кода, потому что параметр «pNewUser» имеет значение null ... это проблема, я получаю нулевую переменную вместо модели, которую нужно сохранить. – Vlad

+1

Рад, что я могу помочь вам найти ответ! – STLDeveloper

+0

Я уже новичок в этом, извиняюсь, чтобы вас разочаровать :)). Моя проблема заключается в том, как отправить модель параметров через вызов, чтобы он мог использоваться в функции сохранения из api ?? – Vlad

1

Несколько вещей, которые я хотел бы проверить/попытаться добраться до сути вопроса:

  1. ли код выше точно такой же, как и в вашем приложении или вы изменили что-либо (даже если только сделать это проще)?

  2. Является ли объект Users, используемый в методе контроллера SaveUserData определенно из той же сборки, что и тот, который вы отправляете из метода InsertNewUser?

  3. Действительно ли объект Users включен в список (например, имеет ли он какие-либо конструкторы)?

  4. Вы пытались выполнить запрос к конечной точке через скрипач? Таким образом, вы берете любые потенциальные ошибки в вызове клиента из уравнения, чтобы узнать, работает ли сам метод контроллера.

  5. Я заметил эту строку:

    string lREST_Uri_Browse = string.Format(@"api/accountapi/saveuserdata" 
    // User data 
    /*pModelSerialized*/); 
    

    Вы форматирование URL и проходящую любой Params к нему? Если да, каковы параметры и каков ваш трафик WebApi?

Этого должно быть достаточно для начала - дайте мне знать, как вы справляетесь.


КСТАТИ: Две вещи, которые поражают меня в коде (не связан с вопросом):

  • Это очень запутанным, чтобы иметь класс под названием «Пользователи», представляющая одного пользователя. Если это код, я бы посоветовал изменить его на единицу.

  • объекты на объекте Users используют аббревиатуры - я не думаю, что это так дорого изложить их, и я могу гарантировать, что любой, кто будет знаком с этим кодом, будет благодарен, если вы поместите полное имя, а не таинственный BCompanyID или менее загадочной, но до сих пор трудно читать (и писать по этому вопросу) FName

0

Я хотел бы использовать JQuery, чтобы получить возможность отправлять некоторые JSon к тому же URL ($.post(@"api/accountapi/saveuserdata", { Email: "[email protected]", FName = "Vlad" ... })), тем самым устраняя InsertNewUser из уравнения. Если вы все еще получаете нулевой параметр pNewUser в SaveNewuser, я бы посмотрел конфигурацию маршрута вашего API, чтобы убедиться, что сервер ожидает SaveUserData(Users). Если вы получите ненулевой pNewUser из jQuery, то я бы посмотрел на результат с InsertNewUser. Если бы мне пришлось делать ставки, я бы поставил свои деньги на конфигурацию маршрутизации.

+0

Маршрутизация имеет настройки по умолчанию. Должно ли это быть чем-то особенным? Имя контроллера - AccountAPI. – Vlad

+0

Вы пытались проверить его с помощью jQuery? – flipdoubt

+0

Кроме того, я думаю, что для публикации сложного типа в WebApi может потребоваться метод, начинающийся с «Post ...», как показано [здесь] (http://www.asp.net/web-api/overview/formats- и-model-binding/json-and-xml-serialization) в разделе «Создание ресурса». – flipdoubt

0

казалось, что я была ошибка с кодом LINQ

Users existingUser = asigCtx.Users.Where(u => u.Email == pNewUser.Email).SingleOrDefault(); 

После того как я решил эту просьбу было нормально.

Tnx для справки :) Цените.

1

У меня была та же проблема несколько недель назад. После нескольких тестов я понял, что мое приложение WebApi по умолчанию использует DataContractJsonSerializer вместо Newtonsoft. Чтобы исправить это, вы можете изменить сериализатор по умолчанию на своем сервере на NewtonSoft или использовать DatacontractJsonSerializer для сериализации вашего объекта и передачи его в HttpWebRequest.

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