WCF从静态方法调用回调
本文关键字:回调 调用 静态方法 WCF | 更新日期: 2023-09-27 17:59:12
我是WCF的新手,我正在努力学习,但我认为我在这里错过了一些重要的东西,我知道这一点,所以请耐心等待。我正在使用一个预先存在的控制台应用程序,我已经向该应用程序添加了一个WCF主机,这是一个过于简化的版本,但它应该会给你带来
namespace mynamespace
{
public class MyConsoleApp
{
static void Main(string[] args)
{
CreateRemoteDebugHost();
StartLongRunningMethods();
}
public static void StartLongRunningMethods()
{
LongRunningMethod1();
LongRunningMethod2();
}
public static void LongRunningMethod1()
{}
public static void LongRunningMethod2()
{}
public void CreateRemoteDebugHost()
{
ServiceHost host = new ServiceHost(typeof(RemoteDebug), new Uri("net.pipe://localhost"));
host.AddServiceEndpoint(typeof(IRemoteDebug), new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), "PipeRemoteDebug");
//Create mex
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.HttpGetUrl = new Uri("http://localhost:8001/RemoteDebug");
host.Description.Behaviors.Add(smb);
host.Open();
}
}
[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IRemoteDebugCallback))]
public interface IRemoteDebug
{
[OperationContract]
string Message(string message);
}
public interface IRemoteDebugCallback
{
[OperationContract(IsOneWay = true)]
void OnMessage(string callbackValue);
}
public class RemoteDebug : IRemoteDebug
{
public string Message(string message)
{
IRemoteDebugCallback callback = OperationContext.Current.GetCallbackChannel<IRemoteDebugCallback>();
callback.OnMessage(message);
return message;
}
}
}
正如您可能知道的,我正试图从长期运行的静态方法内部将调试或状态消息发送回客户端。所有的管道似乎都正常工作,主机启动了,我可以很好地向我的客户端应用程序添加服务引用,但当尝试从longrunningprocesss静态方法调用WCF回调时,问题就开始了。我似乎不知道该怎么做。
同样令人困惑的是,我看到的几乎每个WCF和回调的例子都假设你所做的一切都是在WCF主机本身的上下文中运行的,显然在我的例子中不是这样。我知道我可能要走了,但这一切都错了,所以有人能告诉我吗?非常感谢您的帮助。
TIA!
还有通过app.config或手动创建的客户端(不要与客户端程序混淆)(例如public class MyClient: ClientBase<IRemoteDebug>
或public class MyClient: DuplexClientBase<IRemoteDebug>, IRemoteDebug
)。这应该向客户端程序发送消息。上面使用DuplexClient的例子来自我的一些代码:
[CallbackBehaviorAttribute(UseSynchronizationContext = true)]
public class SubCallback : IRemoteDebug
{
public void Event(SomeClass evt)
{
// some handling code using:
//public delegate void EventCallbackHandler(SomeClass evt);
}
}
InstanceContext ctx = new InstanceContext(new SubCallback ());
MyClient _client = new MyClient(
ctx,
new NetNamedPipeBinding(NetNamedPipeSecurityMode.None),
new EndpointAddress("net.pipe://localhost/ServiceEndpointName"));
此外,您可能希望将一些选项传递给您的服务,例如:
[ServiceBehavior(
InstanceContextMode = InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Single)]
public class RemoteDebug : IRemoteDebug
{}
可能是很多因素导致了您的特定问题,但这为我解决了问题。