【问题标题】:C# Web API - Internal Server Error 500C# Web API - 内部服务器错误 500
【发布时间】:2016-07-06 19:17:43
【问题描述】:

当我的 WebAPI 控制器中的返回类型为“字符串”时,SuccessStatusCode 在我的 MVC 控制器中返回“OK”,但是当返回类型为名为“USER”的模型时,我得到了这个内部服务器错误。这是我的代码:

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;
    }
}

调用 WebAPI 的 MVC 控制器:

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

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

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

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

【问题讨论】:

  • “我知道 api 返回的结果很好”——不,不是。它正在崩溃,很可能来自未处理的异常。 :) 将返回类型更改回 USER 并向我们展示 Fiddler 输入+输出以请求 API。然后在GetUserInfo()的开头设置一个断点,看看它是否真的退出了那个方法没有异常。
  • @bzlm 当我在 api 控制器 `return userInfo' 行中添加断点时,我得到了所需的结果,我知道它,因为它显示在 Visual Studio 的 Autos Windows 中。 userInfo 变量包含该用户的所有信息。
  • 是的,它无异常退出。它返回到 MVC 控制器,然后给出异常。
  • 那么是 MVC 客户端还是 API 服务器崩溃了?如果是客户端,那么您反序列化为 JSON 的尝试可能失败了?再次,展示小提琴。 stackoverflow.com/a/24677189/7724
  • 是的,我在尝试反序列化时也遇到了错误,但在我到达那条线之前,我得到了 SuccessStatusCode:Internal Server Error 而不是 Ok

标签: c# asp.net-mvc-4 asp.net-web-api internal-server-error


【解决方案1】:

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

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

准确查看正在发生的事情的最简单方法是使用自定义 MessageHandler,它会强制正文更早进行缓冲,以便您可以看到实际的异常。看看this blog post 的例子,强制它向你展示真正的失败。

【讨论】:

  • 让我猜猜。检测到循环引用... ;)(EF 延迟加载)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多