C# Web API - 内部服务器错误 500

7
当我的WebAPI控制器返回类型为“string”时,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”,但根据这段代码,我会收到StatusCode:500Internal Server Error(无论何意)。我已经试图在每个可能的地方插入断点,并且我知道api正在正确返回结果。我只是不明白为什么以下行会发生这种情况。
HttpResponseMessage responseMessage = await client.GetAsync(url+GetUserInfoURL);

当我使用USER作为返回类型,且返回整个USER模型而不是一个字符串时,会出现InternalServerError错误。

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


我知道API返回的结果很好,但实际上它正在崩溃,很可能是由于未处理的异常。 :) 将返回类型更改回“USER”,并向我们展示请求API的Fiddler输入+输出。然后在“GetUserInfo()”的开头设置断点,并查看它是否真的在没有异常的情况下退出该方法。 - bzlm
在 API 控制器的“return userInfo”行处设置断点,我得到了所需的结果,因为它在 Visual Studio 的 Autos 窗口中显示。userInfo 变量包含有关该用户的所有信息。 - Bivo Kasaju
那么是MVC客户端还是API服务器崩溃了?如果是客户端,那么你尝试反序列化为JSON可能会失败?再次展示fiddle。https://dev59.com/uWQn5IYBdhLWcg3w1qEc#24677189 - bzlm
为了帮助调试,您需要暂时配置IIS将错误详细信息发送到浏览器,以便您可以查看500错误的确切原因。 - Jasen
在配置IIS以显示错误后,只需使用浏览器直接浏览到API的GetUserInfo()端点(与客户端使用的相同URL)并查看发生了什么。 - bzlm
显示剩余6条评论
1个回答

1
通常情况下,这意味着它无法序列化响应。 一旦您的控制器返回一个USER实例,WebAPI中的某个地方必须将其序列化为客户端请求的格式。在这种情况下,客户端请求了“application/json”。默认的JsonMediaTypeFormatter使用JSON.Net将您的C#对象转换为json以供客户端使用。 显然,该序列化步骤失败了,但响应代码并没有告诉您确切的原因。查看this blog post以获取示例,使用自定义MessageHandler可以强制缓冲区提前,以便查看实际异常发生的情况。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接