【发布时间】:2010-04-09 12:28:57
【问题描述】:
我的理解可能是错误的,但我认为一旦应用了正确的属性,DataContractSerializer 就会将完全限定的实例呈现给调用者。
代码运行,对象返回。但奇怪的是,一旦我查看返回的对象,我注意到命名空间消失了,并且通过(Web 应用程序)服务引用公开的对象层次结构似乎变得“扁平”(不知何故)。现在,我希望通过 Web 服务实现这一点……但不是通过 WCF。当然,我对 WCF 能做什么的理解可能是错误的。
...请记住,我仍在尝试所有这些。
所以我的问题是……
问:我可以在 WCF 服务中做一些事情来强制命名空间通过(服务引用)数据客户端代理呈现吗?
问:或者,我是否(仅仅)错误地使用了服务?
问:这可能吗?
服务代码看起来像……
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class DataService : IFishData
{
public C1FE GetC1FE(Int32 key)
{
//… more stuff here …
}
public Project GetProject(Int32 key)
{
//… more stuff here …
}
}
[ServiceContract]
[ServiceKnownType(typeof(wcfFISH.StateManagement.C1FE.New))]
[ServiceKnownType(typeof(wcfFISH.StateManagement.Project.New))]
public interface IFishData
{
[OperationContract]
C1FE GetC1FE(Int32 key);
[OperationContract]
Project GetProject(Int32 key);
}
[DataContract]
[KnownType(typeof(wcfFISH.StateManagement.ObjectState))]
public class Project
{
[DataMember]
public wcfFISH.StateManagement.ObjectState ObjectState { get; set; }
//… more stuff here …
}
[DataContract]
KnownType(typeof(wcfFISH.StateManagement.ObjectState))]
public class C1FE
{
[DataMember]
public wcfFISH.StateManagement.ObjectState ObjectState { get; set; }
//… more stuff here …
}
[DataContract(Namespace = "wcfFISH.StateManagement")]
[KnownType(typeof(wcfFISH.StateManagement.C1FE.New))]
[KnownType(typeof(wcfFISH.StateManagement.Project.New))]
public abstract class ObjectState
{
//… more stuff here …
}
[DataContract(Namespace = "wcfFISH.StateManagement.C1FE", Name="New")]
[KnownType(typeof(wcfFISH.StateManagement.ObjectState))]
public class New : ObjectState
{
//… more stuff here …
}
[DataContract(Namespace = "wcfFISH.StateManagement.Project", Name = "New")]
[KnownType(typeof(wcfFISH.StateManagement.ObjectState))]
public class New : ObjectState
{
//… more stuff here …
}
Web 应用程序代码看起来像……
public partial class Fish_Invite : BaseForm
{
protected void btnTest_Click(object sender, EventArgs e)
{
Project project = new Project();
project.Get(base.ProjectKey, base.AsOf);
mappers.Project mapProject = new mappers.Project();
srFish.Project fishProject = new srFish.Project();
srFish.FishDataClient fishService = new srFish.FishDataClient();
mapProject.MapTo(project, fishProject);
fishProject = fishService.AddProject(fishProject, IUser.UserName);
project = null;
}
}
如果我不清楚……
问题在于我期望看到(返回)的命名空间与实际返回的不同。
fishProject.ObjectState 应该看起来像...
srFish.StateManagement.Project.New
fishC1FE.ObjectState 应该看起来像...
srFish.StateManagement.C1FE.New
fishProject.ObjectState 实际上看起来像...
srFish.New1
fishC1FE.ObjectState 实际上看起来像...
srFish.New
【问题讨论】:
标签: wcf inheritance datacontractserializer proxy-classes service-reference