netpeertcpbinding是否支持请求/应答?

本文关键字:应答 请求 是否 支持 netpeertcpbinding | 更新日期: 2023-09-27 18:02:55

我有一个WCF p2p网状网络,它在单向对话中运行良好。我正在研究是否有可能调用一个方法来将两个数字相加并返回和。

然而,当我试图连接时,我得到一个错误:

Contract需要Request/Reply,但是Binding' NetPeerTcpBinding'不支持它或者没有正确配置支持它

c#连接

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>

netpeertcpbinding是否支持请求/应答?

看来这篇文章的答案是否定的

WCF