1

情况

我有一个使用 Windows Azure AppFabric 服务总线NetTcpRelayBinding连接到端点的客户端库。客户端库由应用程序托管,不一定是 .NET 应用程序。无论如何,app.config 是不可能的,这意味着一切都应该在代码中配置。

Machine.config 是一种选择,但如果可以避免它会更好。本地自定义代理或前端服务器可能是另一种选择,但我想先探索这个选项,然后再彻底改变架构。

系统绑定没有问题,但是我还没有想出或找到如何在代码中将以下配置添加到ChannelFactory的解决方案:

<extensions>
  <bindingElementExtensions>
   <add name="tcpRelayTransport" type="Microsoft.ServiceBus.Configuration.TcpRelayTransportElement, Microsoft.ServiceBus, Version=1.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </bindingElementExtensions>

  <bindingExtensions>
   <add name="netTcpRelayBinding" type="Microsoft.ServiceBus.Configuration.NetTcpRelayBindingCollectionElement, Microsoft.ServiceBus, Version=1.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </bindingExtensions>
 </extensions>
4

3 回答 3

2

这是现在已经测试过的解决方案。希望它可以清楚地说明问题的真正含义,也许它可以帮助遇到类似问题的其他人。感谢有时间调查该问题的同事。

解决方案是动态编辑配置并添加对所需绑定元素扩展的引用(在任何层中没有app.config 或在客户端机器中没有更改 machine.config):

        var service = ServiceModelSectionGroup.GetSectionGroup(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None));

        var tcpRelayTransportExtension = new ExtensionElement("tcpRelayTransport", "Microsoft.ServiceBus.Configuration.TcpRelayTransportElement, Microsoft.ServiceBus, Version=1.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
        var netTcpRelayTransportExtension = new ExtensionElement("netTcpRelayBinding", "Microsoft.ServiceBus.Configuration.NetTcpRelayBindingCollectionElement, Microsoft.ServiceBus, Version=1.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");

        if (service.Extensions.BindingElementExtensions.ContainsKey(tcpRelayTransportExtension.Name) == false)
        {
            service.Extensions.BindingElementExtensions.Add(tcpRelayTransportExtension);
        }

        if (service.Extensions.BindingElementExtensions.ContainsKey(netTcpRelayTransportExtension.Name) == false)
        {
            service.Extensions.BindingElementExtensions.Add(netTcpRelayTransportExtension);
        }

不过,感谢所有试图提供帮助的人!

于 2012-03-21T11:44:06.933 回答
1

您可以通过编写自定义服务主机工厂来通过代码添加绑定元素扩展。此处已回答了类似的问题

根据您的 WCF 服务类型,您只需在编写自定义服务主机工厂时继承相应的 servicehostfactory 类。例如如下图:

  1. 如何构建自定义服务主机

  2. 如果构建 REST WCF 服务,请使用WebServiceHostFactory

  3. 如果构建 WCF 服务,请使用ServiceHostFactory

于 2012-02-14T15:06:06.763 回答
0

此处提供了没有配置的示例:http: //code.msdn.microsoft.com/windowsazure/Relayed-Messaging-Windows-0d2cede3

以下是代码片段:

ChannelFactory<IEchoChannel> channelFactory = null; 
IEchoChannel channel = null; 
try 
{
    //Create a Behavior for the Credentials 
    TransportClientEndpointBehavior sharedSecretServiceBusCredential = new TransportClientEndpointBehavior(); 
    sharedSecretServiceBusCredential.TokenProvider = TokenProvider.CreateSharedSecretTokenProvider(issuerName, issuerSecret); 

    //Create a Channel Factory 
    channelFactory = new ChannelFactory<IEchoChannel>(new NetTcpRelayBinding(), new EndpointAddress(serviceAddress)); 
    channelFactory.Endpoint.Behaviors.Add(sharedSecretServiceBusCredential); 

    LogMessage("Opening channel to: {0}", serviceAddress); 
    channel = channelFactory.CreateChannel(); 
    channel.Open(); 

    LogMessage("Sending: {0}", echoTextBox.Text); 
    string echoedText = channel.Echo(echoTextBox.Text); 
    LogMessage("Received: {0}", echoedText); 
    echoTextBox.Text = string.Empty; 

    LogMessage("Closing channel"); 
    channel.Close(); 
    LogMessage("Closing factory"); 
    channelFactory.Close(); 
    } 
    catch (Exception ex) 
    { 
        LogMessage("Error sending: {0}<br/>{1}", ex.Message, ex.StackTrace.Replace("\n", "<br/>")); 

        // Close the channel and factory properly 
        if (channel != null) 
        { 
            CloseCommunicationObject(channel); 
        } 
        if (channelFactory != null) 
        { 
            CloseCommunicationObject(channelFactory); 
        } 
    } 
于 2012-02-14T17:50:10.943 回答