2016-07-06 3 views
4

Когда у меня есть тип возврата «строка» в моем контроллере WebAPI, SuccessStatusCode возвращает «ОК» в моем MVC-контроллере, но когда тип возврата имеет модель с именем USER, , Я получаю эту внутреннюю ошибку сервера. Вот мой код:C# Web API - Внутренняя ошибка сервера 500

WebAPI:

public class UserController : ApiController 
{ 
    OnlineCenterEntities db = new OnlineCenterEntities(); 

    public USER GetUserInfo(string userName, string domain) 
    { 
     USER userInfo = (from u in db.USERs 
         where u.USER_NAME.ToUpper() == userName.ToUpper() && u.LDAP_NAME.ToUpper() == domain.ToUpper() 
         select u).FirstOrDefault(); 

     return userInfo; 
    } 
} 

MVC контроллер, который вызывает WebAPI:

public class HomeController : Controller 
{ 
    HttpClient client; 
    string url = "http://localhost:61566/api/user/"; 

    public HomeController() 
    { 
     client = new HttpClient(); 
     client.BaseAddress = new Uri(url); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); 
    } 

    public async Task<ActionResult> Index(string userName, string domain) 
    { 
     string GetUserInfoURL = String.Format("GetUserInfo?userName={0}&domain={1}", userName, domain); 
     HttpResponseMessage responseMessage = await client.GetAsync(url+GetUserInfoURL); 

     if (responseMessage.IsSuccessStatusCode) 
     { 
      var responseData = responseMessage.Content.ReadAsStringAsync().Result; 
      var userInfor = JsonConvert.DeserializeObject<USER>(responseData); 
     } 

     return View(); 
    } 

модель USER:

public partial class USER 
{ 

    public int USER_ID { get; set; } 
    public string USER_NAME { get; set; } 
    public string FIRST_NAME { get; set; } 
    public string LAST_NAME { get; set; } 
    public string LDAP_NAME { get; set; } 
    public string EMAIL { get; set; } 
} 

В моей WebAPI, если я изменю возвращение введите от USER до string (и, конечно, измените тип возвращаемой переменной на сом e string (userInfo.FIRST_NAME)), я получаю SuccessStatusCode как «ОК», но с этого кода я получаю Internal Server Error с StatusCode: 500 (что бы это ни значило). Я попытался вставить точку останова во все возможные моменты, и я знаю, что api возвращает результат. Я просто не понимаю, почему следующая строка

HttpResponseMessage responseMessage = await client.GetAsync(url+GetUserInfoURL); 

дает ошибку InternalServerError, когда у меня есть тип возвращаемого USER, и вернуть всю пользовательскую модель, а не только одну строку.

Не беспокойтесь о параметрах userName и domain, которые я передаю контроллерам, они работают нормально!

+0

«Я знаю, что api возвращает результат в порядке» - нет, это не так. Это сбой, скорее всего, из необработанного исключения. :) Измените возвращаемый тип на 'USER' и покажите нам вход Fiddler + вывод для запроса API. Затем установите точку останова в начале 'GetUserInfo()' и посмотрите, действительно ли он выходит из этого метода * без * исключения. – bzlm

+0

@bzlm, когда я добавляю точку прерывания в строке 'return userInfo 'контроллера api, я получаю требуемый результат, и я знаю его, потому что он отображается в Autos Windows в Visual Studio. В переменной userInfo содержится вся информация об этом пользователе. –

+0

Да, он выходит без исключения. Он возвращается к контроллеру MVC, а затем дает исключение. –

ответ

0

Обычно, когда это происходит, это означает, что он не выполняет сериализацию ответа. Как только ваш контроллер вернет экземпляр USER, где-то WebAPI должен сериализовать его в формате, запрошенном клиентом.

В этом случае клиент запросил «application/json». По умолчанию JsonMediaTypeFormatter использует JSON.Net для превращения вашего объекта C# в json для клиента. По-видимому, этот шаг сериализации не работает, но код ответа не говорит точно, почему.

Самый простой способ увидеть, что именно происходит, это использовать пользовательский MessageHandler, который заставляет тело буферизовать раньше, чтобы вы могли видеть фактическое исключение. Взгляните на пример this blog post, чтобы он показал вам реальный сбой.

+0

Позвольте мне угадать. Обнаружена круговая ссылка ...;) (EF lazy loading) – bzlm