Cha*_*ert 0 xml wcf soap xml-serialization
假设我有一个具有名字,姓氏和年龄的Person对象.我想将此person对象发送到一个Web服务,该Web服务只知道并关心具有名字和姓氏的person对象.但我希望xml代表完整的人物对象,包括要发回的年龄.
我已经有了一种机制,可以将xml存储在幕后的对象中,并且可以简单地将xml提供给WCF,但我不想使用普通的XmlSerializer.我希望能够说"这里是xml.用肥皂包裹并发送".
我打算使用WCF.我将在哪里挂钩来控制序列化?
虽然这个问题的例子是人为的.它清楚地说明了我的问题.假设我有一个像这样的类的应用程序:
/* person A */
class Person {
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我将此传递给Web服务.Web服务知道编写的另一个Person类:
/* person B */
class Person {
public string FirstName { get; set; }
public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
该服务具有以下方法签名的方法:
Person SomeOperation(Person p);
Run Code Online (Sandbox Code Playgroud)
当我从我的应用程序调用此Web服务并将其传递给我的人A版本时,Web服务就可以接收它了.它忽略了Age属性.但是当它重新创建响应时,Age属性会消失.
我明白为什么会这样.WCF将响应反序列化为实际的c#对象,因此丢弃随请求一起发送的额外XML.因此,没有Age属性可以发回.
我有一种机制来实际使用XML作为我的对象的后备存储.如果后备存储中存在该对象不需要的XML,则它只是位于那里并且未被使用.我希望在响应中发送用作后备存储的完整XML.
如果这是一个基本的c#应用程序,我可以简单地创建一个包含FirstName和LastName属性的IBasicPerson接口,并让Person类实现接口,如下面的代码:
public interface IBasicPerson {
string FirstName { get; set; }
string LastName { get; set; }
}
public class Person : IBasicPerson {
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我可以在其他类中创建一个操作来获取并返回IBasicPerson接口:
public SomeClass {
public IBasicPerson SomeOperation(IBasicPerson p) {
/* do stuff */
return p;
}
}
Run Code Online (Sandbox Code Playgroud)
当我打电话给它时,它不关心Age属性,信息也不会丢失.这是因为SomeOperation中的IBasicPerson和传入的实际Person实例都引用了完全相同的对象.但是,在通过线路进行WCF调用时不是这种情况.
从调用WCF服务的应用程序的角度来看,方法的返回值中的对象与传入的对象不同.
我的XML后备存储解决了这个问题,但前提是我能弄清楚如何防止它丢失.这就是为什么我要弄清楚我应该在WCF序列化过程中挂钩的原因.
在使用WCF时,通常不使用XML.您使用对象,并让WCF根据配置序列化对象.这样,相同的服务可以使用SOAP over HTTP,或通过TCP/IP二进制,或其他任何东西,都使用相同的代码.
| 归档时间: |
|
| 查看次数: |
605 次 |
| 最近记录: |