2014-04-02 18 views
2

我有一個由net.tcp綁定配置的WCF服務。我可以通過客戶端獲得服務,並可以調用它的方法。我也可以到達OperationContext.Current。如:當我將它存儲到靜態變量時,我無法訪問OperationContext.Current

[ServiceContract(CallbackContract = typeof(IServiceCallback))] 
public interface IService 
{ 
    [OperationContract(IsOneWay = true)] 
    void Register(); 
} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)] 
    public class Service :IService 
    { 
     public void Register() 
     { 
      CallBacker.Client = OperationContext.Current. 
           GetCallbackChannel<IServiceCallback>(); 

     } 
    } 

} 

public class CallBacker 
{ 
    public static IServiceCallback Client { get; set; } 

    public void Call(string message) 
    { 
     Client.Test(message); 
    } 
} 

當客戶端調用服務的註冊方法,我可以看到通道存儲在CallBacker.Client但是當我打電話「呼叫」方法的CallBacker> Call(字符串消息),客戶端爲空。

奇怪的是,當我將服務配置從net.tcp設置爲wsdualhttpbinding時,它的工作原理非常完美。 net.tcp和wsdualhttpbinding之間有什麼不同可以導致這個奇怪的問題?

+0

似乎沒有任何問題如果服務公開了兩個端點(tcp,httpdual),您應該能夠選擇「設置服務配置」你從客戶那裏使用哪一個,並在它們之間來回切換。如果你真的改變了服務,那麼這可能是不同的? – PatFromCanada

+0

你可以顯示使用'CallBacker'類的調用嗎?它什麼時候被叫?另外,您正在使用哪個版本的WCF? –

回答

0

您在這裏誤解了靜態的含義。 在這種情況下,靜態意味着,對於每個CallBacker實例都是相同的。然後與你的concurency.multiple多個客戶端在同一時間可能會使用您的callbacker.client回調,但上下文將不會是你所期望的。 刪除靜態並查看是否在日誌文件中出現任何錯誤。

1

看來,CallbackContract應類型的IServiceCallback [ServiceContract(CallbackContract = typeof(IServiceCallback))]

的下面,是您在wsDualHttpBinding和NetTcpBinding的

<services> 
    <service behaviorConfiguration="behavior" name="WCFCallbackTry.Service1"> 
    <endpoint address="" binding="wsDualHttpBinding" bindingConfiguration="HttpEndPoint" 
     contract="WCFCallbackTry.IService" name="HttpEndPoint"/> 
    <endpoint address="net.tcp://localhost:8004/Service1.svc" bindingConfiguration="BindingConfiguration" binding="netTcpBinding" 
     contract="WCFCallbackTry.IService" name="NetTcpEndPoint"/> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost:8018/Service1.svc"/> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 

也請找NetTcpBinding的使用

<netTcpBinding> 
    <binding name="BindingConfiguration" receiveTimeout="infinite" sendTimeout="10.00:00:00" maxBufferPoolSize="1073741824" maxBufferSize="1073741824" maxReceivedMessageSize="1073741824"> 
     <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/> 
     <reliableSession enabled="true" inactivityTimeout="01:00:00" ordered="true" /> 
    </binding> 
    </netTcpBinding> 

的配置CallBacker.Client在使用時保存CallBackContract的值netTcpBinding,並且如果CallBackContract更改爲IServiceCallback

+0

這是我的錯誤。在簡化問題的同時,我忘了它。我在這個問題上解決它。那不是真正的問題。 –

+0

@RyuKaplan - 如果您發佈更多詳細信息,比如如何進行回調調用,綁定配置詳細信息,您使用哪個客戶端來調用服務等,這將會很有幫助。 – dera