1

我有一个服务接口:

[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 应该会导致 ArticleImage 在 WSDL 中弹出。不幸的是,这根本不会发生。这是为什么?

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

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


这是大量测试的结果:

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

2 回答 2

1

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

于 2009-12-14T12:53:11.757 回答
0

为什么需要?您的服务在哪里暴露了可能是 的东西ArticleImage

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

您也可以只返回您的类型列表( List<ArticleImage>),这将适用于所有场景(并且对于 WSDL 等来说很容易);并让客户在他们的最后制作字典。


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

于 2009-12-14T12:52:59.383 回答