2013-03-08 121 views
2

我有一個WCF p2p網狀網絡運行良好的單向會話。我正在調查是否可以調用一個方法來添加兩個數字,並返回和總和。是否netpeertcpbinding支持請求/答覆

合同要求請求/應答,但結合「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> 

回答