2012-10-07 116 views
2

我用this鏈接瞭解WCF編程WCF:沒有終點聽

我使用的樣例代碼在鏈接,這是客戶端和服務器之間的連接。現在,我要轉換的是控制檯應用程序WPF但是當我運行客戶端(當然我運行的客戶端之前運行服務器)我得到這個錯誤:

有沒有終點,在net.pipe聽://本地主機/ PipeReverse可以接受消息。此 通常是由不正確的地址或SOAP操作引起的。

另外我應該說,示例代碼沒有任何app.config文件。

MainWindow.xaml文件的客戶:

[CallbackBehavior(ConcurrencyMode=ConcurrencyMode.Multiple,UseSynchronizationContext=false)] 
public partial class MainWindow : Window,ICallbacks 
{ 
    public void MyCallbackFunction(string callbackValue) 
    { 
     Dispatcher dispatcher=Dispatcher.CurrentDispatcher; 
     dispatcher.BeginInvoke(new Action(
     () => textBox1.Text = callbackValue)); 
     //  MessageBox.Show("Callback Received: {0}",callbackValue); 
    } 
    IStringReverser _channel; 
    [ServiceContract(SessionMode = SessionMode.Required, 
    CallbackContract = typeof(ICallbacks))] 
    public interface IStringReverser 
    { 
     [OperationContract] 
     string ReverseString(string value); 
    } 


    public MainWindow() 
    { 
     InitializeComponent(); 
     MainWindow myCallbacks = this; 
     var pipeFactory = new DuplexChannelFactory<IStringReverser>(
      myCallbacks, 
      new NetNamedPipeBinding(), 
      new EndpointAddress(
       "net.pipe://localhost/PipeReverse")); 
     ThreadPool.QueueUserWorkItem(new WaitCallback(
      (obj) => 
      { 
       _channel = pipeFactory.CreateChannel(); 
      })); 
    } 

    private void button1_Click(object sender,RoutedEventArgs e) 
    { 
     _channel.ReverseString("Hello World"); 
    } 
} 
public interface ICallbacks 
{ 
    [OperationContract(IsOneWay = true)] 
    void MyCallbackFunction(string callbackValue); 
} 

MainWindow.xaml文件服務器:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 


    private void button1_Click(object sender,RoutedEventArgs e) 
    { 
     using (ServiceHost host = new ServiceHost(
     typeof(StringReverser), 
     new Uri[]{ 
     new Uri("net.pipe://localhost") 
     })) 
     { 
      host.AddServiceEndpoint(typeof(IStringReverser), 
       new NetNamedPipeBinding(), 
       "PipeReverse"); 

      host.Open(); 

      MessageBox.Show(Properties.Resources.Service_is_available__Press__ENTER__to_exit_); 
      host.Close(); 
     } 
    } 
} 

[ServiceContract(SessionMode = SessionMode.Required, 
       CallbackContract = typeof(ICallbacks))] 
public interface IStringReverser 
{ 
    [OperationContract] 
    string ReverseString(string value); 
} 

public interface ICallbacks 
{ 
    [OperationContract(IsOneWay = true)] 
    void MyCallbackFunction(string callbackValue); 
} 

public class StringReverser : IStringReverser 
{ 
    public string ReverseString(string value) 
    { 
     char[] retVal = value.ToCharArray(); 
     int idx = 0; 
     for (int i = value.Length - 1;i >= 0;i--) 
      retVal[idx++] = value[i]; 

     ICallbacks callbacks = 
    OperationContext.Current.GetCallbackChannel<ICallbacks>(); 

     callbacks.MyCallbackFunction(new string(retVal)); 

     return new string(retVal); 
    } 
} 
+0

你的服務器和你的客戶端運行在**相同的機器**上嗎? 'NetNamedPipe'綁定**僅**在同一臺機器上工作。 –

+0

Arash,你是否爲這個服務寫了兩次接口? IStringReverser應該只在一個單獨的dll中寫入一次,這樣確切的接口可以被服務器和客戶端共享。完全限定名稱空間可以有所作爲,它不僅僅是單獨的接口名稱。 – Despertar

+0

是的,他們在同一臺機器上,我也用NetTcpBinding測試過,但沒有成功 – Arash

回答

2

的問題就解決了這麼容易,

所有的問題是,我以後誤緊密結合點擊服務器上的按鈕!

+0

真棒,到這時候我已經執行了你的代碼,三次,它在我身邊運行得很好。但是我無法理解你的MyCallbackFunction在客戶端的實現。爲什麼你需要使用Dispatcher和BeginInvoke? – Abhijeet

+0

請閱讀以下鏈接:http://www.switchonthecode.com/tutorials/wcf-callbacks-hanging-wpf-applications – Arash

+0

感謝您的召回 – Arash