POST web api内部错误500

本文关键字:错误 内部 api web POST | 更新日期: 2023-09-27 18:17:27

我的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

POST web api内部错误500

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

改变你的网页。

为了弄清问题的根源,我想检查几件事:

  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

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

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

似乎我有一个错误与LINQ代码

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

在我解决了这个问题后,请求是ok的。

感谢您的帮助。