【问题标题】:ServiceKnownTypeAttribute doesn't pop up in WSDLServiceKnownTypeAttribute 不会在 WSDL 中弹出
【发布时间】:2009-12-14 12:50:50
【问题描述】:

我有一个服务接口:

[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 实体时,它不会弹出。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 这就是 ServiceKnownType 应该派上用场的地方!而且它不起作用。
    • 不,ServiceKnownTypeAttribute 用于指示您的服务操作之一公开的某些基本类型的可能派生类型。这不是你的情况。在您提供的示例中,stringbool 是唯一的类型。
    【解决方案2】:

    为什么需要?你的服务在哪里暴露了可能可能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 上的类型显式。

    【讨论】:

    • 假设我返回一个 ArticleImage 的 HashTable?
    • 我正在使用 Visual Studio 来使用 WCF 服务(添加服务引用)。不幸的是,它根本没有弹出。
    • 这对我有用...它生成:[System.Diagnostics.DebuggerStepThroughAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")] [System.Runtime.Serialization.DataContractAttribute(Name="ArticleImage", Namespace="http://schemas.datacontract.org/2004/07/Models")] [System.SerializableAttribute()] public partial class ArticleImage 等...
    • 确实,这也适用于我。问题是我试图包含的“模型”实际上是一个 Linq to SQL 对象。
    猜你喜欢
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多