我使用的樣例代碼在鏈接,這是客戶端和服務器之間的連接。現在,我要轉換的是控制檯應用程序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);
}
}
你的服務器和你的客戶端運行在**相同的機器**上嗎? 'NetNamedPipe'綁定**僅**在同一臺機器上工作。 –
Arash,你是否爲這個服務寫了兩次接口? IStringReverser應該只在一個單獨的dll中寫入一次,這樣確切的接口可以被服務器和客戶端共享。完全限定名稱空間可以有所作爲,它不僅僅是單獨的接口名稱。 – Despertar
是的,他們在同一臺機器上,我也用NetTcpBinding測試過,但沒有成功 – Arash