如果我将HttpGetEnabled设置为false会发生什么?

19

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

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

  <serviceMetadata httpGetEnabled="false"/>
无论是真还是假,当我尝试在客户端应用程序中使用“Add Service Reference…”并单击“Discover”来提供服务引用时,我能够检索到服务引用。但是,当我删除以下两行时:-
<endpoint address="mex" binding="mexBasicHttpBinding" contract="IMetadataExchange"/>

<serviceMetadata httpGetEnabled="false"/>

现在在客户端应用程序中尝试使用“添加服务引用...”并单击“发现”后,我无法检索服务引用....

现在有人能告诉我这到底是什么意思吗? 为什么在将其设置为False之后仍然允许设置引用?为什么删除这些行后不允许设置引用?

2个回答

23
MEX和WSDL是告知潜在客户服务结构的两种不同方案。因此,您可以选择将服务合同作为“元数据交换格式”(MEX)或“Web服务描述语言”(WSDL)公开,后者可通过HTTP(s)访问。因此,为了生成代理,您需要元数据信息。当您删除serviceMetadata-line时,您表示您不提供WSDL格式的元数据。但是,在之前发布您的元数据的MEX中仍然有效,因此您可以从这些元数据生成代理。由此自然而然地得出结论,当您既不提供WSDL也不提供MEX格式的信息时,您无法生成代理。正如Joel C所指出的那样,绑定是一个(几乎)正交的概念。无论您允许客户端通过基本HTTP、ws HTTP、net命名管道还是水晶球与您交谈,都不依赖于您如何发布服务。WCF安全指南项目和/或MS WCF安全的实践和模式可能提供更深入的见解。

我不确定这是否回答了问题:“如果我将HttpGetEnabled设置为false会发生什么?”,是吗? - Tim Schmelter

6
您正在添加服务引用,该引用基于元数据交换(mex)生成代理。httpGetEnabled配置允许您设置一个http端点,该端点将允许使用WSDL生成非mex代理,例如旧版.NET webservice代理。它们是不同的协议,由不同的设置控制。我认为,如果您拥有<serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8080/SampleService?wsdl"/>,您可以从.NET 2.0中添加Web服务引用,而使用<serviceMetadata httpGetEnabled="false"/>配置则无法实现该操作。

1
这意味着通过指定“httpGetEnabled = true”,我的WCF服务也可以作为Web服务使用。如果是这样,那么“BasicHttpBinding”的用途是什么?因为使用BasicHttpBinding的主要优点是使您的WCF服务可用于旧版本并且可以作为Web服务使用(称为向后兼容性功能,我不太确定),请告诉我们“HttpGetEnabled”和“BasicHttpBinding”之间的确切区别/关系。如果它们是相关的,那么当我使用“WsHttpBinding”时,为什么我们应该使用“HttpGetEnabled=true”行? - Anil Purswani
2
你的WCF服务如何与其他进程通信(其终结点绑定)以及如何公开有关自身的元数据(其元数据配置)是彼此独立的。如果您计划将服务作为SOAP Web服务访问(使用配置了WsHttpBinding的终结点),则将元数据公开为WSDL(使用“httpGetEnabled =”true“和”httpGetUrl“)是有意义的,可以单独使用任一设置。 - Joel C
那么为什么在删除以下两行代码后,<endpoint address="mex" binding="mexBasicHttpBinding" contract="IMetadataExchange"/> <serviceMetadata httpGetEnabled="false"/> 它不允许我在客户端应用程序中引用。(我不想将其用作Web服务)我认为暴露ServiceMetadata与WCF通信有某种相关性。因为没有元数据,客户端无法建立通信。由于客户端应用程序必须知道服务的类型和其他组件才能建立通信,这只可能通过元数据实现。 - Anil Purswani
2
这只涉及到WCF的发现方面。没有它,您无法生成代理。如果您正在生成WCF代理,则将使用MetadataExchange配置;如果您正在使用基于WSDL的代理,则将使用httpGetEnabled设置。但是一旦您拥有了代理,任何一种方法都应该可以实际使用服务,这些设置只应影响生成代理的能力。 - Joel C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接