0

我修改了我的 web.config 以添加自定义绑定以增加缓冲区和消息大小,并且似乎在显式创建服务元素时,它以某种方式破坏了对我的行为元素的引用。

当我尝试使用 WCF 测试客户端从 VS 运行我的 Web 服务时,或者我转到服务页面时,我收到错误消息:

Metadata publishing for this service is currently disabled.

我已经将我的 web.config 与几个不同的来源进行了比较,一切似乎都匹配。我不知道问题是什么。

这是 System.serviceModel 元素:

<system.serviceModel>    
<services>
  <service name="BIMIntegrationWS.BIMIntegrationService" behaviorConfiguration="metadataBehavior">
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <endpoint address="http://localhost:1895/BIMIntegrationService.svc" 
              binding="customBinding" bindingConfiguration="customBinding0" 
              contract="BIMIntegrationWS.IBIMIntegrationService"/>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="metadataBehavior">
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
      <serviceMetadata httpGetEnabled="true"/>
      <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<bindings>
  <customBinding>
    <binding name="customBinding0">
      <binaryMessageEncoding />
      <httpTransport maxReceivedMessageSize="262064"
                   maxBufferSize="262064"
                   maxBufferPoolSize="262064" />
    </binding>
  </customBinding>
</bindings>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"  aspNetCompatibilityEnabled="true"/>

似乎 Web 服务页面没有找到该元素。我没有收到抱怨目标 behaviorConfiguration 不存在或类似情况的错误,只是未启用元数据发布。

任何帮助将不胜感激。

谢谢。

4

2 回答 2

2

我想我已经“解决”了这个问题。更多稍后。

编辑:为了“解决”我的问题,我基本上在我的应用程序中添加了一个新的 WCF 服务,并让它实现了我以前的接口,然后我从我的原始服务中复制了所有代码,当我调整了 .config 文件(到看起来很像问题中发布的那个),一切正常。

当然,我知道,就像我们都知道的那样,这里没有魔法,一定有一些差异。这是我注意到/记得,在我创建了名为“BIMIntegrationService.svc”的原始服务之后,我认为这个名称太长了,所以我将我的类重命名/重构为“BIMIntegrationWS”。但是,这样做不会更改服务文件的名称(因此会更改 http:// 地址中的文件名称)。

长话短说,我对 .config 进行了 2 处更改,一切正常:

1)我改变了:

<service name="BIMIntegrationWS.BIMIntegrationService" behaviorConfiguration="metadataBehavior">

<service name="BIMIntegrationWS.BIMIntegrationWS" behaviorConfiguration="metadataBehavior">

像这样运行服务后,我收到一个错误(这次很有帮助)抱怨如果启用了 multipleSiteBindings,则端点地址必须是相对的。所以:

2)我将它设置为false(因为我不记得它为什么首先在那里)并且一切正常。

我想当我的网络服务似乎根本没有使用我的“服务”元素时,我应该得到一个提示。:\

编辑2:

实际上,您可以在我的第二条评论中看到,在原始问题中,自动生成的标签指向:,而不是“BIMIntegrationService”。那应该已经放弃了。

我怀疑许多其他人会遇到同样的问题,但以防万一。

于 2010-08-05T16:01:34.433 回答
0

我也遇到过同样的麻烦;我已经正确配置了所有内容(甚至从我运行的以前的服务中复制了代码),但在允许服务公开元数据方面没有任何变化。但是,如果我在 app.config 中出现拼写错误、解析错误等,我会收到异常通知,告诉我要纠正问题(这告诉我服务正在读取配置,而忽略它。

我能够通过在主机应用程序中生成配置设置来绕过它:

System.ServiceModel.Description.ServiceMetadataBehavior smb = new System.ServiceModel.Description.ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
ServiceBase host = new Servicebase(typeof(MyService), new Uri("http://localhost:1234/"));
host.Description.Behaviors.Add(smb);
host.Open();

...

host.Close();

基本上允许代码覆盖并推送我想要应用的配置文件更改。我知道这并不理想,但我通过 Windows 服务公开了该服务,这使得这变得可行。如果您确实解决了问题,请传递解决方案,因为我很想知道为什么(至少在您的情况下,如果不是我们的情况下)它失败了。

于 2010-08-05T19:42:41.837 回答