我在使用netTcpBinding WCF客户端/服务器时遇到了一些回调问题。以下是代码... 有什么想法吗?
服务端:
协定:
服务:
这是我用来启动服务的代码。
这是App.Config文件。
客户端:
连接和拨打电话
我相信我已经拥有所有所需的部件。通过谷歌搜索,我走了几条不同的路线,但没有真正的结果。我可以看到服务调用回调,但我的客户端从未收到它。
提前感谢您的帮助,我知道这是WCF 101级别的问题,但我现在陷入困境。
更新
在客户端,我得到了这个异常:“传入的消息由于针对请求-应答操作而被定位,但由于未设置MessageId属性,因此无法进行回复处理。”
接着是:“当关闭时,通道收到了一个意外的输入消息,其操作为 'http://tempuri.org/IMyService/OnCallback'。只有在您不再期望任何输入消息时,才应关闭通道。”
服务端:
协定:
using System.Runtime.Serialization;
using System.ServiceModel;
namespace API.Interface
{
[ServiceContract(CallbackContract = typeof(IServiceCallback))]
public interface IMyService
{
[OperationContract]
void DoSomething();
}
public interface IServiceCallback
{
[OperationContract(IsOneWay = true)]
void OnCallback();
}
}
服务:
using System;
using System.Security.Cryptography.X509Certificates;
using System.ServiceModel;
using System.Timers;
using API.Interface;
namespace API.Service
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Reentrant)]
public class MyService : IMyService
{
public static IServiceCallback callback;
public static Timer Timer;
public void DoSomething()
{
Console.WriteLine("> Session opened at {0}", DateTime.Now);
callback = OperationContext.Current.GetCallbackChannel<IServiceCallback>();
Timer = new Timer(1000);
Timer.Elapsed += OnTimerElapsed;
Timer.Enabled = true;
}
void OnTimerElapsed(object sender, ElapsedEventArgs e)
{
callback.OnCallback();
}
}
}
这是我用来启动服务的代码。
var service = new MyService();
// Start up the WCF API
var service = new ServiceHost(turboService);
service.Open();
这是App.Config文件。
<system.serviceModel>
<services>
<service name="API.Service.MyService">
<endpoint address="" binding="netTcpBinding" bindingConfiguration=""
contract="API.Interface.IMyService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8732/MyService/"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
客户端:
客户端
回调服务
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using USBAutomationTester.ServiceReference;
namespace USBAutomationTester
{
[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, UseSynchronizationContext = false)]
public class CallbackService : IMyServiceCallback
{
public void OnCallback()
{
Console.WriteLine("> Received callback at {0}", DateTime.Now);
}
}
}
连接和拨打电话
var instanceContext = new InstanceContext(new CallbackService());
var service = new TurboValidateServiceClient(instanceContext);
service.DoSomething();
App.Config
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_IMyService" />
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://localhost:8732/MyService/"
binding="netTcpBinding" bindingConfiguration="NetTcpBinding_ITurboValidateService"
contract="ServiceReference.IMyService"
name="NetTcpBinding_IMyService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</client>
</system.serviceModel>
我相信我已经拥有所有所需的部件。通过谷歌搜索,我走了几条不同的路线,但没有真正的结果。我可以看到服务调用回调,但我的客户端从未收到它。
提前感谢您的帮助,我知道这是WCF 101级别的问题,但我现在陷入困境。
更新
在客户端,我得到了这个异常:“传入的消息由于针对请求-应答操作而被定位,但由于未设置MessageId属性,因此无法进行回复处理。”
接着是:“当关闭时,通道收到了一个意外的输入消息,其操作为 'http://tempuri.org/IMyService/OnCallback'。只有在您不再期望任何输入消息时,才应关闭通道。”