我有一個不可序列化的對象,我想從一個單獨的進程訪問。我環顧四周,似乎唯一可行的選擇是使用WCF,但我不確定如何做到這一點,因爲我是新來的WCF。如果我創建了一個WCF服務,如何將WinForm「掛接」到WCF服務中的各種事件中?例如,用戶直接與WCF服務進行通信,我希望我的WinForm客戶端得到通知。我如何能夠知道用戶何時完成了WCF服務的某些操作,並讓WinForm客戶端了解了這一點?在另一個進程中處理WCF事件
回答
實現您所尋找的一種方法是在您的服務上實施回調合同。然後,你的勝利形式的應用程序將能夠「訂閱」在服務上發起的事件(例如修改你的對象)。
要做到這一點,你實現了回調契約的服務合同:
[ServiceContract]
public interface IMyService_Callback
{
[OperationContract(IsOneWay = true)]
void NotifyClients(string message);
}
[ServiceContract(CallbackContract = typeof(IMyService_Callback))]
public interface IMyService
{
[OperationContract]
bool Subscribe();
}
然後你實現你的服務:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Reentrant)]
public class MyService : IMyService
{
private List<IMyService_Callback> callbacks;
public MyService()
{
this.callbacks = new List<IMyService_Callback>();
}
private void CallClients(string message)
{
callbacks.ForEach(callback => callback.NotifyClients(message));
}
public bool Subscribe()
{
var callback = OperationContext.Current.GetCallbackChannel<IMyService_Callback>();
if (!this.callbacks.Contains(callback))
{
this.callbacks.Add(callback);
}
// send a message back to the client
CallClients("Added a new callback");
return true;
}
}
在你的WinForms客戶端,您只需要實現回調方法:
[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, UseSynchronizationContext = false)]
public partial class ServiceClient : Form, IMyService_Callback
{
// Sync context for enabling callbacks
SynchronizationContext uiSyncContext;
public ServiceClient()
{
InitializeComponent(); //etc.
uiSyncContext = SynchronizationContext.Current;
// Create proxy and subscribe to receive callbacks
var factory = new DuplexChannelFactory<IMyService>(typeof(ServiceClient), "NetTcpBinding_IMyService");
var proxy = factory.CreateChannel(new InstanceContext(this));
proxy.Subscribe();
}
// Implement callback method
public void NotifyClients(string message)
{
// Tell form thread to update the message text field
SendOrPostCallback callback = state => this.Log(message);
uiSyncContext.Post(callback, "Callback");
}
// Just updates a form text field
public void Log(string message)
{
this.txtLog.Text += Environment.NewLine + message;
}
}
配置服務:
<system.serviceModel>
<services>
<service name="TestService.MyService" behaviorConfiguration="Normal">
<endpoint
address="net.tcp://localhost:8000/MyService"
contract="TestService.IMyService"
binding="netTcpBinding" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="Normal" >
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
配置客戶端
<system.serviceModel>
<client>
<endpoint address="net.tcp://localhost:8000/MyService"
binding="netTcpBinding"
contract="TestService.IMyService"
name="NetTcpBinding_IMyService">
</endpoint>
</client>
</system.serviceModel>
謝謝,這是一個很好的答案。 – Skoder 2012-01-17 16:04:13
代碼實際上並不工作 - 將盡快使用工作代碼進行更新。但總的模式是正確的。 – 2012-01-17 16:24:07
現在可以使用代碼 - 必須在客戶端上用DuplexChannelFactory替換ChannelFactory。 – 2012-01-17 16:55:57
- 1. 在另一個類中處理事件
- 2. 處理來自另一個進程的鼠標事件
- 3. 在另一個事件處理程序中調用一個事件處理程序?
- 4. 無法從主幹視圖中的另一個事件處理程序調用一個事件處理程序
- 5. 添加一個事件處理程序到另一個
- 6. 在一個處理程序中處理所有事件?
- 7. 如何訪問另一個類中的事件處理程序
- 8. 另一個類中的WPF事件處理程序
- 9. C++從另一個程序集中處理WPF窗口並處理事件
- 10. 在另一個類中處理來自控件的事件
- 11. Python中的文件處理:被另一個進程使用
- 12. 如何觸發另一個事件中的事件處理程序,C#
- 13. 使用一個事件處理程序進行多個操作
- 14. 在另一個進程中處理斷點
- 15. 需要另一個事件處理程序(按下按鈕)Gtk2Hs
- 16. 複製事件處理程序分配給另一個實例
- 17. 3 linkbuttons一個事件處理程序
- 18. 將一個元素的事件處理程序附加到另一個JS中
- 19. 從另一個事件處理程序調用事件處理程序方法並傳遞額外的參數
- 20. 將兩個事件處理組合成一個事件處理
- 21. 處理的另一proc中有一個進程的結果
- 22. 處理在另一個表單上定義的控件事件
- 23. 如何運行從另一個批處理文件,但在一個單獨的進程的批處理文件?
- 24. 如何在一個處理程序中處理多個更改事件?
- 25. 在另一個進程中使用的文件錯誤在批處理
- 26. 如何處理在另一個按鍵點擊事件在c#
- 27. 觸發在另一個代碼塊中分配的jQuery事件處理程序
- 28. 如何在另一個事件處理程序中使用此關鍵字
- 29. 如何刪除在另一個事件處理程序中創建的TabControl?
- 30. 從另一個XAMLS處理故事板
我想你應該嘗試WCF全雙工服務。但你將不得不創建一些邏輯來審計行爲並將它們傳輸到你的winform應用程序 – 2012-01-17 05:44:22
我不確定爲什麼使用WCF將允許你從另一個進程訪問一個不可序列化的對象? – 2012-01-17 08:18:22
@ShoaibShaikh - 我是新來的WCF,但看全雙工,似乎它是用戶和服務之間的合同。 WinForm客戶端是第三方,不直接調用WCF服務。 – Skoder 2012-01-17 15:19:53