2011-06-14 84 views
1

我对WCF很新,我想学习,但我想我在这里错过了一些重要的东西,我知道这一点,所以请亲切。我与我添加了一个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;     
     } 


    } 

} 

的JIST正如你可能会说我想将调试或状态消息从长时间运行的静态方法内部发送回客户端。所有的管道似乎都正常工作,主机出现了,我可以添加一个服务引用到我的客户端应用程序,但是当尝试从长时间运行的静态方法调用WCF回调时,麻烦就开始了。我似乎无法弄清楚如何正确地做到这一点。

还有一点很让人困惑的是,我所见过的几乎每个WCF和回调的例子都假设你正在做的每件事都是从WCF主机本身的上下文中运行的,显然在我的例子中情况并非如此。我知道我可能会把这一切都弄错了,所以有人可以直接对我进行评估吗?任何帮助是极大的赞赏。

TIA!

回答

1

有客户端(不要与客户端程序混淆)通过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 
    {} 

这可能是很多事情引起你的具体问题,但是这为我解决了问题。

+0

非常感谢你,这完全让我走上了正确的道路。我很感激。 – Uproden 2011-06-22 20:09:28