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
您的代码中有错误。500错误表示您的代码包含一个未处理的异常,该异常杀死了其工作进程。
改变你的网页。
为了弄清问题的根源,我想检查几件事:
-
上面的代码是否与您的应用程序完全相同,或者您是否更改了任何内容(即使只是为了使其更简单)?
-
是否在SaveUserData控制器方法中使用的
Users
对象绝对来自与您从InsertNewUser
方法发布的相同的程序集? -
Users
对象在列表上是否完整(例如,它是否有任何构造函数)? -
您是否尝试通过fiddler执行对端点的请求?通过这种方式,您可以将客户机调用中的任何潜在错误排除在外,以查看控制器方法本身是否有效。
-
我注意到这一行:
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的。
感谢您的帮助。