2011-09-23 8 views
0

나는 다음과 같은 유형이 있습니다 속성이 사용됩니다

public enum MyEnum 
{ 
    Value1, 
    Value2 
} 

[DataContract] 
public class Configuration 
{ 
    [DataMember] 
    public MyEnum MyValue { get; set; } 
    [DataMember] 
    public Credentials CredentialValues { get; set; } 
} 

[DataContract, KnownType(typeof(CustomCredentials))] 
public class Credentials 
{ 

} 

[DataContract] 
public class CustomCredentials : Credentials 
{ 
    [DataMember] 
    public string Property1 { get; set; } 
    [DataMember] 
    public string Property2 { get; set; } 
} 

그리고 내 서비스 인터페이스에

, 나는 Configuration의 인스턴스를 반환하는 기능을 가지고 CredentialValues 속성은 완전히 채워진 인스턴스 CustomCredentials으로 설정됩니다. 클라이언트 또는 서버에서 오류가 발생하지 않지만 데이터가 서버에서 직렬화되고 클라이언트가 수신하는 동안 CustomCredentials의 속성에는 값이 없습니다. 클라이언트에서 이러한 속성을 제대로 deserialize하려면 여기에서 무엇을 변경해야합니까?

참고로 클라이언트와 서버 간의 연결은 클라이언트와 서비스 응용 프로그램이 공유하는 데이터/서비스 계약 프로젝트를 사용하여 NetTcpBinding을 통해 DuplexChannelFactory으로 이루어 지므로 서비스는 자체 호스팅됩니다. 다시 생성해야 할 수도있는 서비스 프록시 유형

답변

0

이 코드를 DataContracts와 함께 Contracts 프로젝트에 추가했습니다.

[ServiceContract(Namespace = "http://schemas.platinumray.com/duplex", SessionMode = SessionMode.Required, CallbackContract = typeof(IService1Callback))] 
public interface IService1 
{ 
    [OperationContract(IsOneWay = true)] 
    void GetData(); 
} 

public interface IService1Callback 
{ 
    [OperationContract(IsOneWay = true)] 
    void SetData(Configuration config); 
} 

서비스가 생성되었습니다.

public class Service1 : IService1 
{ 
    public void GetData() 
    { 
     var x = new Configuration() 
     { 
      MyValue = MyEnum.Value1, 
      CredentialValues = new CustomCredentials { Property1 = "Something", Property2 = "Something else" } 
     }; 
     OperationContext.Current.GetCallbackChannel<IService1Callback>().SetData(x); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 

     using (ServiceHost host = new ServiceHost(typeof(Service1), new Uri[] { new Uri("net.tcp://localhost:6789") })) 
     { 
      host.AddServiceEndpoint(typeof(IService1), new NetTcpBinding(), "Service1"); 
      host.Open(); 
      Console.ReadLine(); 
      host.Close(); 
     } 
    } 
} 

클라이언트를 생성했습니다.

public class CallbackHandler : IService1Callback 
{ 
    public void SetData(Configuration config) 
    { 
     Console.WriteLine(config.CredentialValues.GetType().Name); 
     Console.WriteLine(((CustomCredentials)config.CredentialValues).Property1); 
     Console.WriteLine(((CustomCredentials)config.CredentialValues).Property2); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     // Setup the client 
     var callbacks = new CallbackHandler(); 
     var endpoint = new EndpointAddress(new Uri("net.tcp://localhost:6789/Service1")); 
     using (var factory = new DuplexChannelFactory<IService1>(callbacks, new NetTcpBinding(), endpoint)) 
     { 
      var client = factory.CreateChannel(); 
      client.GetData(); 
      Console.ReadLine(); 
      factory.Close(); 
     } 
    } 
} 

출력은 예상대로 다음 :

CustomCredentials 
Something 
Something else 

그래서이 실제로 데이터 계약 중 하나를 수정하지 않고 일했다 ... 같은 결과 나는 양방향 운영 및 단지로 되돌릴 경우 콜백을 사용하지 않고 직접 Configuration을 반환하십시오.

또한 자격 증명을 추상화했지만 문제를 재현하지 못했습니다.

내가 놓친 것이 있습니까?

+0

나는 이것이 WCF와 완전히 관련이없는 내 머리 부분의 오류라고 판명했기 때문에 현상금을 수령하고 수여합니다. 당신의 도움을 주셔서 감사합니다. –

+0

감사합니다. 과거에 그러한 실수에 대한 나의 주식보다 많은 것을 만들었을 때, 나는 이것이 사실일지도 모른다고 생각했다. 어쨌든 다 정렬 되었기 때문에 다행입니다. 감사합니다, 동료 Bonehead. –

관련 문제