1

状況

Windows Azure AppFabric ServiceBusNetTcpRelayBindingを使用してエンドポイントに接続するクライアントライブラリがあります。クライアントライブラリは、必ずしも.NETアプリケーションではないアプリケーションによってホストされます。とにかく、app.configは問題外です。つまり、すべてをコードで構成する必要があります。

Machine.configは1つのオプションですが、回避できる方がよいでしょう。ローカルカスタムプロキシまたはフロントエンドサーバーも別のオプションですが、アーキテクチャを大幅に変更する前に、まずこのオプションを検討したいと思います。

システムバインディングに問題はありませんが、コードで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

これが現在テストされているソリューションです。うまくいけば、それが問題が実際に何であったかを明らかにし、おそらくそれは同様の問題を抱えている他の誰かを助けるでしょう。問題を調査する時間があった同僚へのクレジット。

解決策は、構成を動的に編集し、必要なBinding Element Extensionsへの参照を追加することでした(どのレイヤーにも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 に答える