我的网络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; }
}
而bellow是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
答案 0 :(得分:3)
您的代码中有错误。 500错误表示您的代码包含一个未处理的异常,导致其工作进程终止。
更改您的web.config文件,以便您的应用程序输出完整的错误消息。
答案 1 :(得分:1)
我会检查/尝试解决问题的一些事项:
上面的代码是否与您的应用程序中的代码完全相同,或者您是否更改了任何内容(即使只是为了简化它)?
SaveUserData控制器方法中使用的Users
对象肯定来自与您从InsertNewUser
方法发布的那个程序集相同的程序集吗?
列表中Users
对象是否已完成(例如,它是否有任何构造函数)?
您是否尝试过通过fiddler向端点执行请求?通过这种方式,您可以从客户端调用中获取任何潜在的错误,以查看控制器方法是否有效。
我注意到这一行:
string lREST_Uri_Browse = string.Format(@"api/accountapi/saveuserdata"
// User data
/*pModelSerialized*/);
您是否正在格式化网址并将任何参数传递给它?如果是这样,什么是params以及你的WebApi路线是什么样的?
这应该足以让你开始 - 让我知道你是如何开始的。
顺便说一句:你的代码中有两件事与我有关(与问题无关):
让一个名为'Users'的类代表一个用户是非常令人困惑的。如果是你的代码,我建议将其改为单数。
Users
对象上的属性正在使用缩写 - 我认为将它们拼写出来并不昂贵,我可以向您保证,如果您放置了此代码,那么对此代码不熟悉的人将会感激不尽全名而不是神秘的BCompanyID
,或者不那么神秘,但仍然难以阅读(并为此写作)FName
答案 2 :(得分:1)
几个星期前我遇到了同样的问题。经过一些测试后,我意识到我的WebApi应用程序默认使用的是DataContractJsonSerializer,而不是Newtonsoft。要修复它,您可以将服务器上的默认序列化程序更改为NewtonSoft,或使用DatacontractJsonSerializer序列化您的对象并将其传递给HttpWebRequest。
答案 3 :(得分:0)
我会使用jQuery将一些Json发布到同一个URL($.post(@"api/accountapi/saveuserdata", { Email: "e@example.com", FName = "Vlad" ... })
),从而从等式中消除InsertNewUser
。如果您在pNewUser
中仍然获得空SaveNewuser
参数,那么我会查看您的API的路由配置,以确保服务器期望SaveUserData(Users)
。如果从jQuery获得非空pNewUser
,那么我会仔细查看InsertNewUser
的输出。如果我不得不打赌,我会把钱花在路由配置上。
答案 4 :(得分:0)
似乎我的LINQ代码错误
Users existingUser = asigCtx.Users.Where(u => u.Email == pNewUser.Email).SingleOrDefault();
我解决了这个问题后,请求还可以。
Tnx的帮助:)感谢。