我有一個WCF服務,它對於常規的客戶端 - >服務器調用來說工作得非常好。然而,我試圖向服務中引入一個簡單的回調函數,但它不起作用......最終我不確定我出錯的地方,所以讓我告訴你設置並告訴你我所知道的。WCF回調沒有在客戶端調用並掛在服務器端
1)合同
public interface IPIRSCallbackService
{
[OperationContract]
void OnCallback();
}
[ServiceContract(CallbackContract = typeof(IPIRSCallbackService))]
public interface IPIRSService
{ etc...
2)服務器合同執行
注:我檢查回調通道的狀態,它是「打開」 - 不知道有多少,這是值得雖然。
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
class PIRSService : IPIRSService
{
public PIRSService()
{
callback = OperationContext.Current.GetCallbackChannel<IPIRSCallbackService>();
var x = ((ICommunicationObject)callback).State;
callback.OnCallback(); // HANGS HERE
}
etc.
3)客戶端 - 創建代理
現在,這可能不是你會看到,因爲我用的是ViewModelLocator注入服務爲我的ViewModels常見的方式......但我相信這不會引起問題...並注意正常的服務調用工作絕對正常。
ViewModelLocator註冊連接到該服務的服務實例
SimpleIoc.Default.Register<PIRSService>(() =>
{
IPIRSCallbackService callback = new PIRSCallbackService();
InstanceContext context = new InstanceContext(callback);
return new PIRSService(context, "PIRSClient");
}, true);
SimpleIoc.Default.Register<IPIRSService>(() =>
{
return SimpleIoc.Default.GetInstance<PIRSService>();
}, true);
4)
DuplexChannelFactory<IPIRSService> channelFactory = new DuplexChannelFactory<IPIRSService>(callbackContext, endpointConfigName);
channelFactory.Credentials.UserName.UserName = userName;
channelFactory.Credentials.UserName.Password = password;
proxy = channelFactory.CreateChannel();
((IClientChannel)proxy).Open();
5)客戶端 - 端點配置
<endpoint address="net.tcp://localhost:20437/PIRSService" binding="netTcpBinding"
bindingConfiguration="StandardNetTcpBinding" contract="PIRS_Common.Service.IPIRSService"
name="PIRSClient" kind="" endpointConfiguration="" behaviorConfiguration="CustomBehavior">
<identity>
<dns value="WCfServer" />
</identity>
</endpoint>
所以,我不知道爲什麼回調協議的客戶端實現不會被觸發......因此服務器sid呼叫回調方法掛在呼叫上......因爲它正在等待回調完成。我相信這是一個回調未被正確註冊的問題......但我不確定我做錯了什麼。我是否需要在客戶端端點或其他地方註冊回調合同?
謝謝您的指針!我在客戶端和服務器端啓用了跟蹤,並且記錄了服務器發送回調並且客戶端收到回調請求...並且在該點之後沒有任何其他記錄!我不知道發生了什麼,因爲我確定必須正確建立連接,以便將消息發送給客戶端......但爲什麼合同方法不會被解僱?如果我發佈日誌會有用嗎?因爲我可能會錯過一些東西! – Sam
有趣的是...回調請求是在客戶端處理的,但是它沒有達到實際執行請求的點...不確定哪個不會發生!記錄在活動中的最後一個階段是「安全協議驗證傳入消息」...我知道這可能看起來像是一個安全問題......但聲明確實意味着該消息已被成功驗證!但說實話,我不知道現在該去哪裏...任何指導將不勝感激! – Sam
我不確定問題出在哪裏,所以也許你可以確認或更正下面的簡單流程流程語句:客戶端 - >服務器 - >回調 - 錯誤 - >客戶端 – Seymour