我想序列化实体框架对象(用户)并使用典型的 webClient.OpenWrite 方法将其发送到 php 脚本。我不知道它是否是一个好方法,但我在 SOAP 对象序列化方面遇到了几十个问题。
我最初的“用户”实体如下所示:
[Table("TableUsers")]
public class User
{
public User()
{
Products = new HashSet<Product>();
}
public int Id { get; set; }
[Required]
[StringLength(4000)]
[Index(IsUnique = true)]
public string UserName { get; set; }
[StringLength(4000)]
public string UserCookie { get; set; }
[StringLength(4000)]
public string CompanyName { get; set; }
...
public virtual ICollection<Product> Products { get; set; }
}
当我尝试序列化所有这些东西并使用下一段代码将其发送到服务器时:
using (Stream postStream = Client.OpenWrite("http://test.com/analytics.php"))
{
SoapFormatter formatter = new SoapFormatter();
formatter.Serialize(postStream, user);
}
- 起初我有一个未处理的异常告诉我
Soap Serializer 不支持序列化泛型类型...
好吧,好吧。我用[SoapIgnore]属性标记了我的产品集合。似乎这个属性不起作用,因为我遇到了同样的错误。然后我决定从用户类和宾果游戏中删除用户构造函数!执行序列化!(好吧,我可以不用接口初始化)
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<i2:User_782DCAD431DFFDCAE6D6A91B7338AB23B0463133F84A5181874089B6BAEBDBC5 id="ref-1" xmlns:i2="http://test.com">
<User_x002B__x003C_Id_x003E_k__BackingField>6</User_x002B__x003C_Id_x003E_k__BackingField>
<User_x002B__x003C_UserName_x003E_k__BackingField id="ref-3">user@test.com</User_x002B__x003C_UserName_x003E_k__BackingField>...
- 我想让我的肥皂查询更具可读性,并为他们提供真实姓名(id 名称,...)(AvitoUser_x002B__x003C_UserName_x003E_k__BackingField ),而且像[MessageBodyMember(Name = "Name")]这样的属性也不起作用。我将我的类标记为[Serializable, MessageContract]并且仍然没有任何变化。
最后,我使用了[DataContract(Name = "User"]和[DataMember(Name = "Name")]之类的属性。结果,Fiddler 向我展示的不是完整的肥皂信封,而是其中的一部分!
这个soapFormatter有什么问题?为什么没有例外?我应该如何标记所有这些类和属性以制作漂亮的印刷肥皂查询?