netpeertcpbinding是否支持请求/回复

时间:2013-03-08 18:33:05

标签: c# wcf wcf-binding

我有一个WCF p2p网状网络,可以正常运行单向对话。我正在调查是否可以调用一个方法来添加两个数字并返回和总和。

但是在尝试连接时遇到错误:

合同需要请求/回复,但是绑定'NetPeerTcpBinding'不支持它,或者没有正确配置以支持它。

C#Connect

private void button1_Click(object sender, EventArgs e)
{
   try
   {
      // Construct InstanceContext to handle messages on callback interface. 
      // An instance of ChatApp is created and passed to the InstanceContext.
      InstanceContext instanceContext = new InstanceContext(new ChatApp(radTextBoxusername.Text, this));

      // Create the participant with the given endpoint configuration
      // Each participant opens a duplex channel to the mesh
      // participant is an instance of the chat application that has opened a channel to the mesh
      factory = new DuplexChannelFactory<IChatChannel>(instanceContext, "ChatEndpoint");
      participant = factory.CreateChannel();

      // Retrieve the PeerNode associated with the participant and register for online/offline events
      // PeerNode represents a node in the mesh. Mesh is the named collection of connected nodes.

      IOnlineStatus ostat = participant.GetProperty<IOnlineStatus>();
      ostat.Online += new EventHandler(OnOnline);
      ostat.Offline += new EventHandler(OnOffline);

      try
      {
         participant.Open();
      }

      catch (CommunicationException)
      {
         radListViewChats.Text = radListViewChats.Text + ("Could not find resolver.  If you are using a custom resolver, please ensure");
         radListViewChats.Text = radListViewChats.Text + ("that the service is running before executing this sample.  Refer to the readme");
         radListViewChats.Text = radListViewChats.Text + ("for more details.");
         return;
      }

      radListViewChats.Text = radListViewChats.Text +("You are connected: " + radTextBoxusername.Text);

      // Announce self to other participants
      participant.Join(radTextBoxusername.Text);

      }

      catch (Exception ex)
      {
         radListViewChats.Text = radListViewChats.Text + ex.Message.ToString();
         MessageBox.Show(ex.Message.ToString());
      }
    }

C#代码添加2个数字

public int Add(int number1, int number2)
{
   try
   {
      return number1 + number2;
   }

   catch (Exception ex)
   {
      form.SetLogText(ex.Message.ToString());
      return -1;
   }
}

的iChat

namespace Client
{
    // Chat service contract
    // Applying [PeerBehavior] attribute on the service contract enables retrieval of PeerNode from IClientChannel.
    [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples", CallbackContract = typeof(IChat))]
    public interface IChat
    {
        [OperationContract(IsOneWay = true)]
        void Join(string member);

        [OperationContract(IsOneWay = true)]
        void Chat(string member, string msg);

        [OperationContract(IsOneWay = true)]
        void Leave(string member);


        [OperationContract(IsOneWay = false)]
        int Add(int number1, int number2);
    }

    public interface IChatChannel : IChat, IClientChannel
    { }
}

ChapApp

public class ChatApp : IChat
{    
    // member id for this instance
    string member;
    Form1 form;

    public ChatApp(string member, Form1 form)
    {
        this.member = member;
        this.form = form;
    }

    //IChat implementation
    public void Join(string member)
    {
        form.SetLogText(member + " joined");
    }

    public void Chat(string member, string msg)
    {
        try
        {               
           //Comment out this if statement if you wish to echo chats from the same member
           if (member != this.member)
           {
               form.SetLogText(msg);
           }
        }

        catch (Exception ex)
        {
           form.SetLogText(ex.Message.ToString());
        }
    }

    public int Add(int number1, int number2)
    {
       try
       {
            return number1 + number2;
       }

       catch (Exception ex)
       {
          form.SetLogText(ex.Message.ToString());
          return -1;
       }

    }

    public void Leave(string member)
    {
        form.SetLogText(member + " left the chat");
    }
}

的App.config

<?xml version="1.0"?>
<configuration>

  <system.serviceModel>

    <client>
      <!-- chat instance participating in the mesh -->
      <endpoint name="ChatEndpoint" address="net.p2p://chatMesh/ServiceModelSamples/Chattest" binding="netPeerTcpBinding" bindingConfiguration="BindingCustomResolver" contract="Client.IChat">
      </endpoint>

    </client>

    <bindings>
      <netPeerTcpBinding>
        <!-- Refer to Peer channel security samples on how to configure netPeerTcpBinding for security -->
        <binding name="BindingCustomResolver" port="0">
          <security mode="None"/>
          <resolver mode="Custom">
            <custom address="net.tcp://localhost/servicemodelsamples/peerResolverService" binding="netTcpBinding" bindingConfiguration="Binding3"/>
          </resolver>
        </binding>
      </netPeerTcpBinding>

      <netTcpBinding>
        <!-- You can change security mode to enable security -->
        <binding name="Binding3">
          <security mode="None"/>
        </binding>
      </netTcpBinding>
    </bindings>

  </system.serviceModel>

  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

1 个答案:

答案 0 :(得分:1)

看起来每篇文章都没有答案

WCF