【问题标题】:Internal error 500 on POST web apiPOST web api 上的内部错误 500
【发布时间】:2016-11-18 00:14:52
【问题描述】:

我的 Web api 应用程序有问题。当我尝试在我的数据库中发布(保存)新用户时出现内部错误 500。 下面的函数是我用来进行客户端调用的函数。

public void InsertNewUser(RegisterModel pNewUser, string pEmail)
{
    // Build rest uri
    string lREST_Uri_Browse = string.Format(@"api/accountapi/saveuserdata"
    // User data
    /*pModelSerialized*/);

    // Complete URI
    string lREST_Uri = Helpers_API.endPoint + lREST_Uri_Browse;

    var client = new HttpClient();

    client.BaseAddress = new Uri(Helpers_API.endPoint);

        var newUser = new Models.Models_API.Users
        {
            Email = pNewUser.Email,
            FName = pNewUser.FName,
            LName = pNewUser.LName,
            Inserted = DateTime.Now,
            ActiveAcc = true,
            AccType = pNewUser.AccType,
            BCompanyID = pNewUser.CompanyID,
            PID = pNewUser.PID,
            Password = pNewUser.Password,
            Token = GetToken(pEmail),
            ThirdParty = 0,
            Gender = pNewUser.Gender,
            BirthDate = pNewUser.BirthDate
        };

        // Add an Accept header for JSON format.
        //client.DefaultRequestHeaders.Accept.Add(
        //    new MediaTypeWithQualityHeaderValue("application/json"));
        // Create the JSON formatter.
        MediaTypeFormatter jsonFormatter = new JsonMediaTypeFormatter();

        // Use the JSON formatter to create the content of the request body.
        HttpContent content = new ObjectContent<Models.Models_API.Users>(newUser, jsonFormatter);

        var result = client.PostAsync(lREST_Uri_Browse, content).Result;
}

这是模型

public class Users
{
    public int BrokerID { get; set; }
    public DateTime Inserted { get; set; }
    public string Email { get; set; }
    public string FName { get; set; }
    public string LName { get; set; }
    public bool ActiveAcc { get; set; }
    public int BCompanyID { get; set; }
    public int PID { get; set; }
    public int AccType { get; set; }
    public string Password { get; set; }
    public string Token { get; set; }
    public int Gender { get; set; }
    public DateTime BirthDate { get; set; }
    public int ThirdParty { get; set; }
}

下面是 APIController 中的 POST:

public HttpResponseMessage SaveUserData(Users pNewUser)
    {
        bool createUser = false;
        // First check for provided email in DB
        Users existingUser = asigCtx.Users.Where(u => u.Email == pNewUser.Email).SingleOrDefault();
        if (existingUser == null)
            createUser = true;
        else if (existingUser.ActiveAcc)
            createUser = true;

        if (createUser)
        {
            using (asigCtx = new AsigPrimeContext())
            {
                Users user = new Users()
                {
                    Email = pNewUser.Email,
                    FName = pNewUser.FName,
                    LName = pNewUser.LName,
                    Inserted = DateTime.Now,
                    ActiveAcc = true,
                    AccType = pNewUser.AccType,
                    BCompanyID = pNewUser.BCompanyID,
                    PID = pNewUser.PID,
                    Password = pNewUser.Password,
                    Token = pNewUser.Token,
                    ThirdParty = 0,
                    Gender = pNewUser.Gender,
                    BirthDate = pNewUser.BirthDate,
                };

                asigCtx.Users.Add(user);

                asigCtx.SaveChanges();
            }
        }
        var response = Request.CreateResponse<Users>(HttpStatusCode.Created, pNewUser);
        return response;
    }

谁能给我一些关于这段代码的建议,因为我是这方面的新手,我只想做到这一点。 TNX

【问题讨论】:

  • 有趣的是,在执行后调用中,当代码应该接收客户端发送的模型作为参数时,这不会发生。

标签: c# asp.net-web-api


【解决方案1】:

您的代码中有错误。 500 错误表示您的代码包含一个未处理的异常,该异常杀死了它的工作进程。

更改您的 web.config 文件,以便您的应用程序输出完整的错误消息。

【讨论】:

  • 在代码的第一部分出现错误,因为参数“pNewUser”为空...这是问题所在,我得到的是空变量而不是需要保存的模型。
  • 很高兴能帮你找到答案!
  • 我已经是新的了,很抱歉让你失望了:))。我的问题是如何通过调用发送参数模型,以便可以在 api 的保存功能中使用它??
【解决方案2】:

我会检查/尝试找出问题的根源:

  1. 上面的代码是否与您的应用程序中的代码完全相同,或者您是否进行了任何更改(即使只是为了使其更简单)?

  2. SaveUserData 控制器方法中使用的Users 对象是否与您通过InsertNewUser 方法发布的程序集完全来自同一程序集?

  3. Users 对象在列表中是否完整(例如,它是否有任何构造函数)?

  4. 您是否尝试过通过 fiddler 执行对端点的请求?这样,您就可以排除客户端调用中的任何潜在错误,以查看控制器方法本身是否有效。

  5. 我注意到这一行:

    string lREST_Uri_Browse = string.Format(@"api/accountapi/saveuserdata"
    // User data
    /*pModelSerialized*/);
    

    您是否正在格式化 url 并将任何参数传递给它?如果是这样,参数是什么?您的 WebApi 路由是什么样的?

这应该足够开始了 - 让我知道你的进展情况。


顺便说一句:你的代码中有两件事让我印象深刻(与问题无关):

  • 让一个名为“Users”的类代表单个用户非常令人困惑。如果是您的代码,我建议将其更改为单数。

  • Users 对象上的属性使用缩写词 - 我认为将它们拼写出来并不那么昂贵,我可以向您保证,如果您输入全名,任何刚接触此代码的人都会感激不尽而不是神秘的BCompanyID,或者不那么神秘但仍然难以阅读(和写作)FName

【讨论】:

    【解决方案3】:

    几周前我遇到了同样的问题。在做了一些测试之后,我意识到我的 WebApi 应用程序默认使用 DataContractJsonSerializer,而不是 Newtonsoft。要修复它,您可以将服务器上的默认序列化程序更改为 NewtonSoft 或使用 DatacontractJsonSerializer 序列化您的对象并将其传递给 HttpWebRequest。

    【讨论】:

      【解决方案4】:

      我会使用 jQuery 将一些 Json 发布到相同的 URL ($.post(@"api/accountapi/saveuserdata", { Email: "e@example.com", FName = "Vlad" ... })),从而从等式中消除 InsertNewUser。如果你在SaveNewuser 中仍然得到一个空的pNewUser 参数,那么我会查看你的API 的路由配置以确保服务器期望SaveUserData(Users)。如果你从 jQuery 得到一个非空的pNewUser,那么我会仔细看看InsertNewUser 的输出。如果我必须下注,我会把钱花在路由配置上。

      【讨论】:

      • 路由有默认设置。应该有什么特别的吗??控制器的名称是 AccountAPI。
      • 你试过用 jQuery 测试它吗?
      • 另外,我认为将复杂类型发布到 WebApi 可能需要使用以“Post...”开头的方法,如“创建资源”部分中的 here 所示。
      【解决方案5】:

      我的 LINQ 代码似乎有错误

      Users existingUser = asigCtx.Users.Where(u => u.Email == pNewUser.Email).SingleOrDefault();
      

      在我解决这个问题后,请求就可以了。

      Tnx 的帮助 :) 欣赏。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-26
        • 1970-01-01
        • 1970-01-01
        • 2013-09-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多