2014-04-02 2 views
2

net.tcp 바인딩으로 구성된 WCF 서비스가 있습니다. 나는 클라이언트에 의해 서비스에 접근 할 수 있고 그것의 메소드를 호출 할 수있다. 또한 OperationContext.Current에 연결할 수 있습니다. 예를 들면 : 정적 변수에 저장할 때 OperationContext.Current에 연결할 수 없습니다.


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

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

클라이언트가 서비스의 등록 메소드를 호출

[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>(); 

     } 
    } 

} 
, 내가 채널을 볼 수는 CallBacker.Client에 저장하지만 호출 할 때 "전화"되는 방법 CallBacker> 호출 (문자열 메시지)의 경우 클라이언트가 null이됩니다.

이상한 점은 net.tcp의 서비스 구성을 wsdualhttpbinding으로 설정하면 완벽합니다. 이 이상한 문제를 일으킬 수있는 net.tcp와 wsdualhttpbinding 사이에 다른 점이 있습니까?

+0

서비스에서 선택할 수 있어야하는 두 개의 끝점 (tcp, httpdual)을 제공하는 경우 "서비스 구성 설정"에 대해 확실하지 않습니다. 하나는 당신이 클라이언트에서 사용하고 그들 사이를왔다 갔다합니다. 실제로 서비스를 변경하는 경우 그 차이가있을 수 있습니다? – PatFromCanada

+0

'CallBacker' 클래스를 사용하는 호출을 보여줄 수 있습니까? 언제 불러? 또한, 어떤 버전의 WCF를 사용하고 있습니까? –

답변

0

여기서 정적 인 의미를 오해하고 있습니다. 이 상황에서 정적 인 것은 모든 CallBacker 인스턴스에서 동일하다는 것을 의미합니다. 그런 다음 concurency.multiple 여러 클라이언트가 동시에 콜백에 callbacker.client를 사용할 수 있지만 컨텍스트가 예상 한 것이 아닙니다. 정적 파일을 삭제하고 로그 파일에 오류가 있는지 확인하십시오.

1

<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> 

을 사용 모두 wsDualHttpBinding 및 netTcpBinding에 대한 설정은 CallbackContract 유형의 [ServiceContract(CallbackContract = typeof(IServiceCallback))]

아래 IServiceCallback 해야한다는 것 같다 CallBacker.Client는 사용하는 동안 CallBackContract의 값을 보유합니다. netTcpBinding 및 CallBackContract가 IServiceCallback으로 변경되는 경우 아무런 문제가없는 것 같습니다

+0

그건 내 실수 였어. 질문을 단순화하는 동안, 나는 그것을 잊어 버렸다. 나는 그 질문에 그것을 고친다. 그게 진짜 문제가 아니야. –

+0

@RyuKaplan - 콜백 호출, 바인딩 구성 세부 사항, 서비스를 호출하는 데 사용하는 클라이언트 등을 작성하는 것과 같은 추가 세부 정보를 게시하면 도움이됩니다. – dera

관련 문제