,所以我的问题有点复杂。
主要目标:注册帐户(class/table),其中包含Web应用程序的播放器列表(类/表)通过WCF服务到SQL Server数据库中。
因此,用于创建类,我使用了创建Account
和Player
类的Linq-to-SQL。Player
在Account
表中具有外键AccountEmail
。因此,Account
类具有EntitySet<Player> _Players;
。
现在,Web应用程序已引用此服务,当用户完成注册时,我正在使用WebClient
和DataContractJsonSerializer
向服务提出邮政请求。
不幸的是,服务或HTTP协议无法理解请求:
system.net.webexception:远程服务器返回错误:(400)
服务器的完整错误响应
https://s31.postimg.org/x6b27uqqjj/errorrr.png
由于某种原因,失败在服务方面不知道如何读取JSON Player DB.designer.cs:line 295 at ReadPlayerFromJson(XmlReaderDelegator
服务:
[OperationContract]
[WebInvoke(UriTemplate = "/Register",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json, Method = "POST")]
void RegisterAccount(Account account);
客户端:
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Account));
MemoryStream mem = new MemoryStream();
Account a = new Account { EMAIL = Email.Text, PASSWORD = Password.Text, NAME = nickname.Text};
a.Players = accountPLayers.ToArray();
ser.WriteObject(mem, a);
string data = Encoding.UTF8.GetString(mem.ToArray(), 0, (int)mem.Length);
WebClient webClient = new WebClient();
webClient.Headers["Content-type"] = "application/json";
webClient.Encoding = Encoding.UTF8;
webClient.UploadString(WEB_SITE_URL+ "/Register", "POST", data);
在没有玩家列表的情况下发送Account
时,操作成功:
{"EMAIL":"test@gmail.com","NAME":"1","PASSWORD":"test","Players":null}
在玩家列表中,操作失败:
{"EMAIL":"test@gmail.com","NAME":"1","PASSWORD":"test","Players":[{"Account":null,"AccountEmail":"test@gmail.com","FirstName":"test","Id":0,"LastName":"test","Type":-1}]}
问题:
我想REST服务期望仅获得
Account
,并且不知道玩家列表是什么?我必须以某种方式定义。为什么在服务中
Account
中有EntitySet<Player> _Players;
?在客户端添加了服务引用后,它是数组Player[]
?为什么linq-to-sql将字段
Account
添加到播放器中?它应该包含什么?如您所见,该字段在JSON中为null。复杂的对象/已知类型必须处理我的问题吗?
请帮助我解决这个问题,谢谢!
已解决!!!因此,如果有人会遇到这个问题,问题是播放器具有电子邮件列的外国钥匙来帐户电子邮件。当您创建JSON时,请勿将电子邮件放在每个播放器中LINQTOSQL知道该关联,并在解析JSON时会自动添加它。
所以我的JSON发送给服务看起来像这样:
{"EMAIL":"test@gmail.com","NAME":"test","PASSWORD":"test@A","Players":[{"Account":null,"AccountEmail":null,"FirstName":"wow","Id":0,"LastName":"koko","Type":null}]}.