2016-07-06 81 views
4

当我在我的WebAPI控制器中返回'string'类型时,SuccessStatusCode在我的MVC控制器中返回'OK',但是当返回类型是名为'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(); 
    } 

用户模型:

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,如果我改变返回键入从USERstring(当然,将返回变量类型更改为som e字符串(userInfo.FIRST_NAME)),我得到SuccessStatusCode'OK',但是从这个代码中,我得到Internal Server ErrorStatusCode: 500(无论这意味着什么)。我试图在每个可能的点上插入断点,并且我知道api返回结果正常。我只是不明白为什么以下行

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

给InternalServerError错误,当我有用户的返回类型,并返回整个用户模型而不是一个字符串。

请不要担心userNamedomain参数,我传递给控制器​​,他们工作正常!

+0

“我知道API是返回结果罚款” - 不,它不是。它崩溃了,很可能来自未处理的异常。 :)将返回类型更改回到'USER'并向我们展示向API发送请求的Fiddler输入+输出。然后在'GetUserInfo()'的开头设置一个断点,看看它是否确实退出那个方法*而没有异常。 – bzlm

+0

@bzlm当我在api控制器的'return userInfo'行中添加一个断点时,我得到了所需的结果,而且我知道它,因为它显示在Visual Studio的Autos窗口中。 userInfo变量包含该用户的所有信息。 –

+0

是的,它无一例外地退出。它回到MVC控制器,然后给出例外。 –

回答

0

通常发生这种情况时,意味着它无法序列化响应。一旦您的控制器返回一个USER实例,WebAPI必须将其序列化为客户端请求的格式。

在这种情况下,客户端请求“application/json”。默认JsonMediaTypeFormatter使用JSON.Net将C#对象转换为客户端的json。显然,序列化步骤失败,但响应代码并没有告诉你到底是什么原因。

查看到底发生了什么的最简单方法是使用自定义的MessageHandler,它可以强制正文缓存,这样您可以看到实际的异常。以this blog post为例,强制它向你展示真正的失败。

+0

让我猜。检测到循环引用...;)(EF延迟加载) – bzlm