在开发不同的Web应用程序时,可能会遇到一个常见的问题:当一个WCF Web服务作为另一个WCF Web服务的客户端时,调用返回的数据成员总是为空或null。然而,如果直接从客户端应用程序调用该Web服务,响应的数据则没有问题,所有属性都能正确填充。通过配置请求的跟踪,可以发现第二个Web服务确实在处理请求,但数据并未返回。
这个问题通常发生在WCF Web服务作为另一个WCF Web服务的客户端时。解决这个问题的方法是为响应使用的Web服务行为和数据合同添加一个命名空间。如果查看跟踪文件,将能够看到实际的数据是在具有动态创建的命名空间的XML节点上返回的。由于客户端不理解这个命名空间,数据被放置在响应的ExtensionData字段上(参见内部Members集合)。可以使用调试器来查看这一点。实际的数据成员是null或设置为默认值(在类中定义)。
为了避免意外行为,总是建议将服务行为和数据合同设置为命名空间。查看服务合同声明上的ServiceBehavior属性和DataContract属性,并分配一个命名空间,如下所示:
C#
[ServiceBehavior(Namespace = "urn:MyserviceNameSpace")]
public class MyService : IMyService
{
}
[DataContract(Name = "MyResponse", Namespace = "urn:MyserviceNameSpace")]
public class MyResponse
{
}
注意Name属性也与类名匹配。在进行这些更改后,需要更新服务的客户端代理(用于消费第二个Web服务的服务)。这将下载命名空间声明,允许绑定准确。如果再次调试,将看到ExtensionData Members集合现在是null。这是因为绑定现在正确地使用了类属性。