2010-06-01 7 views
3

내 솔루션에는 각각 자신의 콜백 인터페이스를 구현하는 몇 가지 WCF 서비스가 있습니다. 의 그들이이라고 가정 해 봅시다 : Subscribe1ISubscribe1ICallback1와 등WCF 서비스의 다른 인터페이스를 상속하는 인터페이스

ICallbacks 사이에 공유하는 몇 가지 방법이 있습니다 일이, 그래서 나는 다음과 같은 인터페이스를 만들어 :

interface ICallback 
{ 
    [OperationContract] 
    void CommonlyUsedMethod(); 
} 

을하고 난 모두를 상속 : ICallback1 : ICallback, ICallback2 : ICallback 등. 모든 콜백 인터페이스에서 CommonlyUsedMethod()을 삭제했습니다.

이제 서비스 측면 코드에서 모든 것이 잘 컴파일되고 서비스는 평소대로 작동 할 수 있습니다. 그러나 클라이언트에 대한 서비스 참조를 업데이트 할 때 CommonlyUsedMethod()는 reference.cs 파일 (ISubscribeCallback 부분)에서 제거되어 더 이상 클라이언트에 데이터를 보내지 못했습니다.

+0

음 ... 서비스의 실제 인스턴스가 다른 인터페이스에서 상속받는 대신 두 인터페이스를 모두 구현하도록 시도 했습니까? 가능성과 마찬가지로, 가치가있을 수 있습니다. 그래서 CallbackConcreteImplementation1 : ICallback1, ICallback 및 CallbackConcreteImplementation2 : ICallback2, ICallback과 비슷합니다. 도움이 될지 모르지만 한 번 시도해보십시오. – EdgarVerona

+0

콜백을 설정할 때 ISubscribe1 인터페이스 전에 사용하기 때문에이 작업을 수행 할 수 없습니다 (또는 어떻게해야할지 모르겠다). [ServiceContract (SessionMode = SessionMode.Required, CallbackContract = typeof (ICallback1))] – avance70

답변

1

이 코드는 정확한 것입니다. 가능한 한 많이 압축했습니다. 새 콘솔 애플리케이션을 시작하고 복사/붙여 넣기 만하면됩니다. 시작하고 서비스 참조를 추가하십시오. CommonlyUsedMethod()는 참조에 존재하지 않지만 다른 메소드는 참조에 존재하지 않습니다. 그것이 프레임 워크 4 일 수 있습니까?

using System; 
using System.ServiceModel; 
using System.ServiceModel.Description; 

namespace TestService 
{ 
    class Program 
    { 
     static void Main() 
     { 
      var serviceHost=new ServiceHost(typeof(Subscribe1), new Uri("net.tcp://localhost:8888")); 
      serviceHost.Description.Behaviors.Add(new ServiceMetadataBehavior()); 
      serviceHost.AddServiceEndpoint(typeof(ISubscribe1), new NetTcpBinding(SecurityMode.None), string.Empty); 
      serviceHost.AddServiceEndpoint("IMetadataExchange", MetadataExchangeBindings.CreateMexTcpBinding(), "mex"); 
      serviceHost.Open(); 

      Console.WriteLine("Working!"); 
      while(Console.ReadKey(true).Key!=ConsoleKey.Escape) { } 
     } 
    } 

    [ServiceContract] 
    interface ICallbackBase 
    { 
     [OperationContract] 
     void CommonlyUsedMethod(); 
    } 

    [ServiceContract] 
    interface ICallback1 : ICallbackBase 
    { 
     [OperationContract] 
     void SpecificMethod(); 
    } 

    [ServiceContract(CallbackContract=typeof(ICallback1))] 
    interface ISubscribe1 
    { 
     [OperationContract] 
     void TestMethod(); 
    } 

    [ServiceBehavior] 
    class Subscribe1 : ISubscribe1 
    { 
     [OperationBehavior] 
     public void TestMethod() 
     { 
     } 
    } 
} 
+2

다음은 솔루션입니다. http : //social.msdn.microsoft.com/Forums/en/wcf/thread/ef896836-dec1-4fa6-9956-e3a4958643ce ... 본질적으로 : 위의 코드에 ICallbackBase 콜백을 가진 빈 인터페이스 ISubscribeBase를 추가하고 ISubscribe1에 의해 상속됩니다. – avance70

+0

또한 :이 경우에는 [ServiceContract]가 실제로 필요하지 않습니다. – avance70

4

기본 인터페이스에도 ServiceContract 특성을 설정해보십시오.

+0

나는 이것이 잘못 될 것이라는 것이 거의 긍정적이다. 곧 다시 확인해 보겠습니다. 나는 직장에서 내 애플 리케이션이 정확한 시나리오가 있고, 거기에 큰 일하고있어. –

+0

나는 이미 나의 일반적인 콜백 인터페이스에서 그렇게했다. 이것은 꽤 정확하게 어떻게 보입니까? [ServiceContract] interface ICallback1 : ICallback {[OperationContract] Method1(); [OperationContract] Method2(); ...} ... 이제 ICallback에 [ServiceContract]를 추가하려고 시도했지만 도움이되지 않았습니다. (또한 servicecontract (및 다른 조합)을 제거하려고 시도했습니다. – avance70

0

코드 내용을 반영합니까?

[ServiceContract] 
public interface ICallbackBase 
{ 
    [OperationContract] 
    void CommonlyUsedMethod(); 
} 

[ServiceContract] 
public interface ICallback1 : ICallbackBase 
{ 
    [OperationContract] 
    void SpecificMethod(); 
} 

이것은 본질적으로 내 생산 솔루션에있는 구조이며, 내가 클라이언트에서 내 방법에 액세스하는 서비스 참조를 추가 할 때 그때 생성 된 프록시를 사용합니다. 참고로

는 생성 된 인터페이스는 다음과 같습니다

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] 
[System.ServiceModel.ServiceContractAttribute(ConfigurationName="MyNamespace.ICallback1")] 
public interface ICallback1 { 

    [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ICallbackBase/CommonlyUsedMethod", ReplyAction="http://tempuri.org/ICallbackBase/CommonlyUsedMethodResponse")] 
    void CommonlyUsedMethod(); 

}

주를 OperationContractAttribute를에서 "ICallbackBase"-이 방법은 어디에서 온 정말 알 수 없습니다.

+0

예, 그게 내 코드이기도합니다. 하지만 참조가있는 경우에만 "SpecificMethod()"및 "CommonlyUsedMethod()"... 나는 뭔가를 놓친 경우에 대비하여 새로운 깨끗한 솔루션을 시작하고 결과를 다시보고합니다. – avance70

0

WCF를 사용하여 수행하려는 작업이 가능한지 잘 모르겠습니다. WCF에서 상속을 사용할 때는 DataContractSerializer가 직렬화하여 다른 쪽에서도 사용할 수 있도록 KnownType 특성을 DataContract에 적용해야합니다. 인터페이스에 KnownType 특성을 넣을 수 없으므로 다른 쪽 끝에 필요하다는 것을 serializer에 알릴 방법이 없습니다. 따라서 클라이언트에 구현할 때 표시되지 않습니다.

관련 문제