このリンクを使用して、WCF プログラミングを学習しました
クライアントとサーバー間の接続には、そのリンクのサンプル コードを使用しました。今、そのコンソール アプリケーションを WPF に変換したいのですが、クライアントを実行するとこのエラーが発生します (もちろん、クライアントを実行する前にサーバーを実行します)。
メッセージを受け入れることができる net.pipe://localhost/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 );
}
}