【问题标题】:What happens if I set HttpGetEnabled = false如果我设置 HttpGetEnabled = false 会发生什么
【发布时间】:2011-08-06 00:37:01
【问题描述】:

我对元数据发布概念感到困惑。

如果在我编写的 WCF 服务配置文件中:

  <serviceMetadata httpGetEnabled="false"/>

不管是真是假。当我尝试使用“添加服务引用...”在客户端应用程序中提供服务引用并单击“发现”时,我能够检索服务引用。

但是当删除以下两行时:-

<endpoint address="mex" binding="mexBasicHttpBinding" contract="IMetadataExchange"/>

<serviceMetadata httpGetEnabled="false"/>

现在,当我尝试使用“添加服务引用...”在客户端应用程序中提供引用并单击“发现”时,我能够检索服务引用.. ..

现在谁能告诉我这到底是什么意思。 为什么将其设置为 False 后仍然允许设置参考。以及为什么在删除这些行之后不允许设置参考。

【问题讨论】:

    标签: .net wcf binding metadata wcf-binding


    【解决方案1】:

    MEX 和 WSDL 是两种不同的方案,用于告知潜在客户您的服务结构。因此,您可以选择将您的服务合同公开为“元数据交换格式”(MEX) 或“web service description language”(WSDL)——后者可通过 HTTP(s) 访问。

    因此,为了生成代理,您需要元数据信息。当您删除 serviceMetadata-line 时,您表示您没有提供 WSDL 格式的元数据。

    但是之前的那一行,在 MEX 中发布您的元数据,仍然处于活动状态,因此您可以从这些元数据生成代理。

    从这些自然可以看出,当您既不提供 WSDL 也不提供 MEX 格式的信息时,您将无法生成代理。

    正如 Joel C 正确指出的那样,绑定是一个(n 几乎)正交概念。您是否允许客户端通过基本的 HTTP、ws HTTP、网络命名管道或水晶球与您交谈,完全不取决于您发布服务的方式。

    WCF security guidance project 和/或 MS "practises and patterns" for WCF security 可能会提供更深入的了解。

    【讨论】:

    • 我不确定这是否回答了这个问题:“如果我设置 HttpGetEnabled = false 会发生什么?”,是吗?
    【解决方案2】:

    您正在添加一个服务引用,它会根据元数据交换 (mex) 生成一个代理。 httpGetEnabled 配置允许您设置允许使用 WSDL 生成非 mex 代理的 http 端点,例如旧版 .NET Web 服务代理。它们是不同的协议,由不同的设置控制。我相信,如果您拥有&lt;serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8080/SampleService?wsdl"/&gt;,您可以从 .NET 2.0 添加 Web 服务引用,而使用配置 &lt;serviceMetadata httpGetEnabled="false"/&gt; 将无法做到这一点。

    【讨论】:

    • 这意味着通过指定“httpGetEnabled = true”将使我的 WCF 服务也被用作 web 服务。如果是,那么“BasicHttpBinding”有什么用?由于使用 BasicHttpBinding 的主要优点是使您的 WCF 服务可用于旧版本并且可以作为 web 服务使用(我猜这个功能称为向后兼容性,我不太确定),请您告诉我们究竟是什么“HttpGetEnabled”和“BasicHttpBinding”之间的差异/共同关系。如果它们是相互关联的,那么当我使用“WsHttpBinding”时,为什么我们应该使用“HttpGetEnabled=true”行
    • 您的 WCF 服务如何与其他进程通信(其端点绑定)以及它如何公开有关自身的元数据(其元数据配置)是相互独立的。如果您计划将服务作为 SOAP Web 服务访问(使用配置有 WsHttpBinding 的端点),则将元数据公开为 WSDL(使用 httpGetEnabled="true"httpGetUrl)是有意义的,任何设置都可以在没有其他。
    • 那为什么去掉以下两行后: - 为什么不是允许我在客户端应用程序中提供参考。(我不想将其用作 Web 服务)我觉得暴露的 ServiceMetadata 与 WCF 通信相互关联。由于没有元数据客户端无法建立通信。由于客户端应用程序必须知道服务的类型和其他组件才能建立可能仅使用元数据的通信
    • 只与WCF的发现方面有关。没有它,您将无法生成代理。如果您正在生成 WCF 代理,则将使用 MetadataExchange 配置;如果您使用的是基于 WSDL 的代理,则将使用 httpGetEnabled 设置。但是,一旦您拥有代理,两者都应该能够真正使用服务,这些设置只会影响生成代理的能力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 2019-10-07
    • 2016-07-30
    • 2010-09-30
    • 2019-09-27
    • 2014-03-01
    • 1970-01-01
    相关资源
    最近更新 更多