2011-06-14 132 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