C# WCF:没有端点侦听
我用link学习WCF编程 我在该链接中使用了用于连接客户端和服务器的示例代码。现在我想将该控制台应用程序转换为WPF,但在运行客户机时(当然,在运行客户机之前运行服务器)会出现以下错误: 在网络上没有端点侦听。pipe://localhost/PipeReverse 这可以接受这个信息。这 通常由不正确的地址或SOAP操作引起 我还要说,示例代码没有任何C# WCF:没有端点侦听,c#,wcf,C#,Wcf,我用link学习WCF编程 我在该链接中使用了用于连接客户端和服务器的示例代码。现在我想将该控制台应用程序转换为WPF,但在运行客户机时(当然,在运行客户机之前运行服务器)会出现以下错误: 在网络上没有端点侦听。pipe://localhost/PipeReverse 这可以接受这个信息。这 通常由不正确的地址或SOAP操作引起 我还要说,示例代码没有任何app.config文件 在客户端的MainWindow.xaml文件中: [CallbackBehavior( ConcurrencyMod
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);
}
这个问题很容易解决
所有的问题是,我错误地关闭连接后,点击按钮在服务器上 您的服务器和客户端是否在同一台机器上运行?
NetNamedPipe
绑定只能在同一台机器上工作..阿拉什,您是否要为服务编写两次接口?IStringReverser只应在单独的dll中写入一次,以便服务器和客户端都可以共享确切的接口。完全限定的名称空间可能会有所不同,不仅仅是接口的名称。是的,它们在同一台机器上,我也用NetTcpBinding进行了测试,但不是success@Despertar:您能给我解释一下吗?您以前是否能够在没有所有双工的情况下连接到服务?如果不是,你想从一个简单的例子开始,这样你就知道你可以连接。然后返回并在上面添加双工和回调。其次,如果您使用TCP托管,则通过键入cmd.exenetstat-ano | findstr 1234
来验证它是否正在侦听,其中1234是您托管的端口。这是您要验证的第一件事,即在您尝试连接到服务器之前,服务器甚至正在侦听连接。太棒了,到目前为止,我已经执行了您的代码三次,并且在我这边运行良好。然而,我无法理解您在客户端的MyCallbackFunction实现。为什么需要使用Dispatcher和BeginInvoke?请阅读此链接:
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 );
}
}