我有一個不可序列化的對象,我想從一個單獨的進程訪問。我環顧四周,似乎唯一可行的選擇是使用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. Python中的文件處理:被另一個進程使用
- 8. 如何觸發另一個事件中的事件處理程序,C#
- 9. 使用一個事件處理程序進行多個操作
- 10. 在另一個進程中處理斷點
- 11. 複製事件處理程序分配給另一個實例
- 12. 將一個元素的事件處理程序附加到另一個JS中
- 13. 3 linkbuttons一個事件處理程序
- 14. 從另一個事件處理程序調用事件處理程序方法並傳遞額外的參數
- 15. 如何運行從另一個批處理文件,但在一個單獨的進程的批處理文件?
- 16. 在一個永久線程中運行事件處理程序
- 17. 在另一個進程中使用的文件錯誤在批處理
- 18. 如何在一個處理程序中處理多個更改事件?
- 19. 如何在另一個事件處理程序中使用此關鍵字
- 20. 觸發在另一個代碼塊中分配的jQuery事件處理程序
- 21. 如何刪除在另一個事件處理程序中創建的TabControl?
- 22. 從另一個XAMLS處理故事板
- 23. 處理子進程退出事件
- 24. PyQt,Qt,一個事件處理程序,處理很多項目
- 25. 在事件處理程序
- 26. 在元素上停止進一步的事件處理程序
- 27. 處理SMS- onReceive觸發另一個活動/類中的事件
- 28. JQuery - 添加另一個事件處理程序,調用前一個
- 29. 在事件處理程序中關閉一個變量
- 30. 我的事件處理程序永遠不會調用,因爲原始事件在另一個事件處理程序中引發?
我想你應該嘗試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