C#Web API - 内部服务器错误500
当我在我的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,如果我改变返回键入从USER
到string
(当然,将返回变量类型更改为som e字符串(userInfo.FIRST_NAME)),我得到SuccessStatusCode
'OK',但是从这个代码中,我得到Internal Server Error
和StatusCode: 500
(无论这意味着什么)。我试图在每个可能的点上插入断点,并且我知道api返回结果正常。我只是不明白为什么以下行
HttpResponseMessage responseMessage = await client.GetAsync(url+GetUserInfoURL);
给InternalServerError错误,当我有用户的返回类型,并返回整个用户模型而不是一个字符串。
请不要担心userName
和domain
参数,我传递给控制器,他们工作正常!
通常发生这种情况时,意味着它无法序列化响应。一旦您的控制器返回一个USER实例,WebAPI必须将其序列化为客户端请求的格式。
在这种情况下,客户端请求“application/json”。默认JsonMediaTypeFormatter使用JSON.Net将C#对象转换为客户端的json。显然,序列化步骤失败,但响应代码并没有告诉你到底是什么原因。
查看到底发生了什么的最简单方法是使用自定义的MessageHandler,它可以强制正文缓存,这样您可以看到实际的异常。以this blog post为例,强制它向你展示真正的失败。
让我猜。检测到循环引用...;)(EF延迟加载) – bzlm
“我知道API是返回结果罚款” - 不,它不是。它崩溃了,很可能来自未处理的异常。 :)将返回类型更改回到'USER'并向我们展示向API发送请求的Fiddler输入+输出。然后在'GetUserInfo()'的开头设置一个断点,看看它是否确实退出那个方法*而没有异常。 – bzlm
@bzlm当我在api控制器的'return userInfo'行中添加一个断点时,我得到了所需的结果,而且我知道它,因为它显示在Visual Studio的Autos窗口中。 userInfo变量包含该用户的所有信息。 –
是的,它无一例外地退出。它回到MVC控制器,然后给出例外。 –