如何在使用net.msmq时添加WCF服务引用

时间:2010-07-06 16:35:09

标签: wcf msmq biztalk

如何在使用该服务时启动WCF客户端仅在net.msmq上可用   - 当您使用“添加服务引用”时,您会收到错误...

无法初始化MetadataExchangeClient实例,因为没有Binding可用于方案'net.msmq'。您可以在构造函数中提供Binding,也可以指定configurationName。 参数名称:scheme 如果在当前解决方案中定义了服务,请尝试构建解决方案并再次添加服务引用。

例如,我已经从MSDN启动并运行了BizTalk示例WcfNetAdapterPublishing,它包含一个使用该服务的控制台测试客户端...

net.msmq://localhost/private/WcfNetMsmqAdapterPublishing

所以看起来这是可能的,但我无论如何都看不到开始?

2 个答案:

答案 0 :(得分:2)

您可以在单独的端点上通过说basicHttpBinding公开相同的服务和数据合同,使用该端点创建服务引用(以及为其创建Metadata Exchange),然后手动调整app.config以使用{ {1}}而不是。

或者您可以与服务器和客户端项目之间的服务和数据协定共享合同程序集,并手动创建配置(真的不是什么大问题),并使用{{1创建代码中的客户端代理}}。由于你已经在使用netMsmqBinding,所以你肯定在线路的两端使用.NET - 所以这种技术应该可以正常工作。

答案 1 :(得分:1)

您需要添加一个前缀为http的基地址(除了您拥有的net.msmq)。因此,在您给出的示例中使用net.msmq,您可以添加:

http://localhost/private/WcfNetMsmqAdapterPublishing ... 

然后您需要为mex添加端点,如下所示:

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

然后启动您的服务(在Visual Studio之外)...然后添加对您添加的http://端点的引用...

以下是我的一个例子:

<service name="Services.Archiver" behaviorConfiguration="FacebookArchiver">
      <endpoint address="" 
                binding="netMsmqBinding" 
                bindingConfiguration="msmq" 
                contract="Services.IArchiver" 
                behaviorConfiguration="validator" />
      <endpoint address="mex" 
                binding="mexHttpBinding" 
                contract="IMetadataExchange" />
      <host>
        <baseAddresses>
          <add baseAddress="net.msmq://localhost/private/Archiver" />
          <add baseAddress="http://localhost/private/Archiver" />
        </baseAddresses>
      </host>
    </service>

在此示例中,您只需将服务引用添加到http://localhost/private/Archiver ...已完成。