Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Web API-内部服务器错误500_C#_Asp.net Mvc 4_Asp.net Web Api_Internal Server Error - Fatal编程技术网

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

C#Web API-内部服务器错误500,c#,asp.net-mvc-4,asp.net-web-api,internal-server-error,C#,Asp.net Mvc 4,Asp.net Web Api,Internal Server Error,当我的WebAPI控制器中的返回类型为“string”时,SuccessStatusCode在我的MVC控制器中返回“OK”,但当返回类型为名为“USER”的模型时,我会收到此内部服务器错误。这是我的密码: WebAPI: public class UserController : ApiController { OnlineCenterEntities db = new OnlineCenterEntities(); public USER GetUserInfo(strin

当我的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();
    }

在我的WebAPI中,如果我将返回类型从
USER
更改为
string
(当然,将返回变量类型更改为某个字符串(userInfo.FIRST_NAME)),我会将
SuccessStatusCode
设置为“OK”,但从这段代码开始,我会得到
StatusCode:500
内部服务器错误(无论这意味着什么)。我已经尝试在每个可能的点插入断点,我知道api返回的结果很好。我就是不明白为什么下面这句话

HttpResponseMessage responseMessage = await client.GetAsync(url+GetUserInfoURL);
当返回类型为USER时,给出InternalServerError错误,并返回整个用户模型而不是一个字符串


请不要担心我传递给控制器的
用户名
参数,它们工作正常

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

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


要准确了解发生了什么,最简单的方法是使用自定义MessageHandler,它会强制主体更早地进行缓冲,以便您可以看到实际的异常。请看一个示例,强制它向您显示真正的失败。

“我知道api返回的结果很好”-不,不是。它正在崩溃,很可能是由于未处理的异常造成的。:)将返回类型更改回
USER
,并向我们显示对API的请求的Fiddler输入+输出。然后在
GetUserInfo()
的开头设置一个断点,看看它是否真的会毫无例外地退出该方法。@bzlm当我在api控制器“return userInfo”行中添加断点时,我得到了所需的结果,我知道这是因为它显示在Visual Studio的自动窗口中。userInfo变量包含有关该用户的所有信息。是的,它会毫无例外地退出。它返回到MVC控制器,然后给出异常。那么是MVC客户端还是API服务器崩溃了?如果是客户端,那么您反序列化为JSON的尝试可能失败了?再次展示小提琴。是的,我在尝试反序列化时也遇到了错误,但在我到达那一行之前,我得到了
SuccessStatusCode:internalserver error
,而不是
Ok
。让我猜猜。检测到循环引用…;)(EF延迟加载)
HttpResponseMessage responseMessage = await client.GetAsync(url+GetUserInfoURL);