2014-06-23 4 views
0

netTcpBinding을 사용하여 WCF 콜백 서비스를 만들려고합니다. 나는에게 피난처를 나는이 문제를 해결하기위한 인터넷을 검색 한 svcutil.exe에 사용하는 대신 서비스 참조를 추가 한WCF 서비스를 호출 할 때 System.InvalidOperationException

An unhandled exception of type 'System.InvalidOperationException' occurred in System.ServiceModel.dll 

Additional information: The InstanceContext provided to the ChannelFactory contains a UserObject that does not implement the CallbackContractType 'Client.WCFService.IHostFunctionsCallback'. 

:하지만, 나는 예외 다음 얻을 서비스의 메소드를 호출 할 때 아직 해결책을 찾지 못했습니다. 여기

내 구현의 :

IHostFunctions.cs (HostLibrary의 일부)

using System.ServiceModel; 

namespace HostLibrary 
{ 
    [ServiceContract(CallbackContract = typeof(ICallback))] 
    public interface IHostFunctions 
    { 
     [OperationContract] 
     void OpenSession(); 
    } 
} 

ICallback.cs (HostLibrary의 일부)

using System.ServiceModel; 

namespace HostLibrary 
{ 
    public interface ICallback 
    { 
     [OperationContract] 
     void OnCallback(); 
    } 
} 

HostFunctions.cs (HostLibrary의 일부)

using System; 
using System.ServiceModel; 
using System.Timers; 

namespace HostLibrary 
{ 
    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] 
    public class HostFunctions : IHostFunctions 
    { 
     #region Implementation of IHostFunctions 

     public static ICallback Callback; 
     public static Timer Timer; 

     public void OpenSession() 
     { 
      Console.WriteLine("> Session opened at {0}", DateTime.Now); 
      Callback = OperationContext.Current.GetCallbackChannel<ICallback>(); 

      Timer = new Timer(1000); 
      Timer.Elapsed += OnTimerElapsed; 
      Timer.Enabled = true; 
     } 

     void OnTimerElapsed(object sender, ElapsedEventArgs e) 
     { 
      Callback.OnCallback(); 
     } 

     #endregion 
    } 
} 

Callback.cs (클라이언트의 일부) 서비스

using System; 
using System.Globalization; 
using System.ServiceModel; 
using System.Threading; 
using Client.WCFService; 

namespace Client 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      var callback = new Callback(); 
      using (var proxy = new HostFunctionsClient(new InstanceContext(callback))) 
      { 
       proxy.OpenSession(); 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

코드는 http://adamprescott.net/2012/08/15/a-simple-wcf-service-callback-example/ 만에에서있는 클라이언트의

using System; 
using System.ServiceModel; 
using HostLibrary; 

namespace WCF_TCP_Callbacks 
{ 
    internal static class Program 
    { 
     private static void Main(string[] args) 
     { 
      using (var sh = new ServiceHost(typeof (HostFunctions))) 
      { 
       sh.Open(); 
       Console.WriteLine("Service started."); 

       Console.ReadLine(); 
       Console.WriteLine("Stopping service..."); 
       sh.Close(); 
      } 
     } 
    } 
} 

Program.cs의

using System; 
using HostLibrary; 

namespace Client 
{ 
    public class Callback : ICallback 
    { 
     #region Implementation of ICallback 

     public void OnCallback() 
     { 
      Console.WriteLine("> Received callback at {0}", DateTime.Now); 
     } 

     #endregion 
    } 
} 

Program.cs netTcpBinding.

답변

0
그것을 설명

[CallbackBehavior(ConcurrencyMode=ConcurrencyMode.Reentrant, UseSynchronizationContext=false)] 
public class Callback : ICallback 
{ 
    .... 
} 

더 세부 사항에 대한 링크를 찾습니다 다시 CallbackBehavior 속성을 사용하여 - SO 호출에 우리가에서 SynchronizationContext를 사용하지 WCF 말할 필요 파견하기

ICallback 클래스의 이름을 IHostFunctionsCallback으로 간단히 변경하여이 문제를 해결했습니다.

나는 왜 이것이 지금 IHostFunctionsCallback을 사용하지 않았던 것처럼 지금도 작동하는지 모르겠다.

1

기본적으로 WCF는 사용 가능한 SynchronizationContext를 사용하여 디스패치를 ​​시도합니다. 이 콜백의 문제점은 아웃 바운드 호출에서 UI 스레드가 이미 차단되어 있다는 것입니다. http://www.dotnetconsult.co.uk/weblog2/PermaLink,guid,b891610a-6b78-4b54-b9a6-4ec81c82b7c0.aspx 하나 더 후 더 http://stefanoricciardi.com/2009/08/28/file-transfer-with-wcp/

+0

나는 이미 첫 번째 블로그 게시물을 읽었지만, 불행히도 CallbackBehavior를 추가하면 여전히 예외가 발생합니다. –

+0

기본적으로 netTCPBinding에서 문제가 발생하기 때문에 nettcpbinding을 사용하여 http://stackoverflow.com/questions/4534923/duplex-communication-using-nettcpbinding-contractfilter-mismatch를 시도해야합니다. –

+0

불행히도 여전히 작동하지 않습니다 ... –

0

나는 게시물이 오래되었음을 알고 있습니다. 실제로 콜백 클래스의 이름은 무엇입니까? CallbackContractType 'Client.WCFService.IHostFunctionsCallback'

그래서 위의 코드에 따라, 콜백, 또는 그 것이다 :

Callback : ICallback 

오류 메시지가이 말한다 :

당신이 게시 코드는이 말한다 실제로 다음과 같이 정의 :

콜백 채널에 대한 속성 참조를 잘못 꾸며 냈다고 가정합니다. d 잘못된 콜백에서.프로젝트를 검색하여 모든 것을 정확하게 명명했는지 확인하십시오.

편집 수정 일한 이유에 와 무슨 일이야 : 당신이 누군가가 그렇게 일반적인에서 콜백 클래스 인터페이스의 이름을 변경하는 팀 환경에서라면 내가 others.It의 경우에 대한 대답 가 될 수있다 WCF에서 사용자 개체가 무엇인지 이해할 수 있습니다. 계약입니다. 한 번에 Visual Studio를 사용하여 클라이언트 또는 서비스를 생성했을 수 있습니다. 이는 또한 이름 짓기 규칙이 IService [콜백 (Callback)] 다음에 나오는 것처럼 나에게 보이는 것을 파울시킬 수 있습니다.

+0

불행히도 나는 더 이상 그 회사에서 일하지 않고 코드를 기억하지 못합니다. –

관련 문제