ServiceKnownTypeAttribute不会在WSDL中弹出

时间:2009-12-14 12:50:51

标签: wcf web-services .net-3.5 serviceknowntype

我有一个服务接口:

[ServiceContract]
[ServiceKnownType(typeof(Models.ArticleImage))]
public interface IPhotoManagementService
{
    [OperationContract]
    bool Login(string username, string password);

    [OperationContract]
    bool IsLoggedIn();

    [OperationContract]
    void UpdateImage(string articleID, string selectedImage);
}

如您所见,我在ServiceContract上指定了typeof(Models.ArticleImage)。

因此,构建此服务的WSDL应该会导致在WSDL中弹出ArticleImage。不幸的是,这根本不会发生。那是为什么?

ArticleImage上有DataContract。当我在界面中返回一个ArticleImage时,WSDL确实会选择ArticleImage。

编辑:它甚至没有在消费项目的服务参考中弹出!


这是大量测试的结果:

  • 我想要添加的模型是LINQ to SQL模型。
  • 当我使用ServiceKnownType添加普通模型时,它可以正常工作。
  • 当我在界面中使用LINQ to SQL实体时,它可以正常工作。
  • 当我通过ServiceKnownType添加LINQ to SQL实体时,它不会弹出。

2 个答案:

答案 0 :(得分:1)

只有用作服务合同操作的输入/输出参数的类型才会在WSDL中发布。

答案 1 :(得分:0)

为什么需要?您的服务在哪里公开了可能ArticleImage的内容?

重新评论;当使用[ServiceKnownType]时,额外的trype仍会在“mex”(通过“svcutil”消耗)中公开 - 但不是由WSDL公开。您使用的是WCF客户端吗?它应该出现(我刚刚检查过......它确实如此)。但总的来说,从Web服务返回模糊数据并不是一个好主意......子类型,当然! Dictionary<string,ArticleImage>甚至是Dictionary<string,SomeBaseType>[KnownType]等),很好!但是objectHashTable等等 - 不是一个好主意(IMO)。

您可能还会返回类型(List<ArticleImage>)的列表,它可以在所有场景中使用(并且易于使用WSDL等);并让客户端将字典放在最后。


关于LINQ-to-SQL; “mex”的对象需要使用[DataContract] / [DataMember]进行修饰。您可以通过切换dbml的“序列化”属性来实现此目的。使用此设置(序列化模式=单向),它应该工作。但说实话,我认为你最好只添加一个虚拟方法,使API上的类型显式化。

相关问题