2016-05-30 150 views
0

我有一個自託管的WCF服務,具有點對點綁定。我正在使用DuplexChannel獲取響應。與ServiceHost的連接正在工作,但是當回調被調用時,即使我沒有使用任何TransactionFlowProperties,我也會得到上面提到的ArgumentExceptionWCF:ArgumentException:TransactionFlowProperty已經存在

[ServiceContract(SessionMode = SessionMode.Allowed, CallbackContract = typeof(ICallbackService))] 
public interface IService 
{ 
    [OperationContract(IsOneWay = true)] 
    void Login(string email, string password); 

    [OperationContract(IsOneWay = true)] 
    void Logout(int userId); 
} 

[DataContract] 
public class User 
{ 
    [DataMember] 
    public string Email {get; set;} 

    [DataContract] 
    public string Password {get; set;} 
} 

我IService實現:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class Service : IService 
{ 
    private static Dictionary<ICallbackService, ICallbackService> pair = new Dictionary<ICallbackService, ICallbackService>(); 
    private static Dictionary<string, ICallbackService> clients = new Dictionary<string, ICallbackService>(); 

    private ICallbackService callback; 

    public Service(){} 

    public void Login(string email, string password) 
    { 
    // User user = getAllUsers().Find(u => u.Email.ToLower() == email.ToLower() && u.Password == password); 
      User user = new User(){Email = email, Password = password}; //for testing purposes 
     callback = OperationContext.Current.GetCallbackChannel<ICallbackService>(); 

     if (user != null) 
     { 
      Console.WriteLine("user : " + email + " has logged in"); 
      clients.Add(email, callback); 
      callback.Authenticate(true); 
     } 
     else callback.Authenticate(false); 
    } 

    public void Logout(int userId) 
    { 
     //TODO 
    } 
} 

我的回調服務:

public interface ICallbackService 
{ 

    [OperationContract(IsOneWay = true)] 
    void Authenticate(bool authenticated); 
} 

的實現回調服務類在我的客戶端應用程序:

[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Single, UseSynchronizationContext = false)] 
public class Client : Service.ICallbackService, 
{ 
    public bool Authentication { get; internal set; } 

    public Client() 
    { 
    } 

    public void Authenticate(bool authenticated) 
    { 
     Console.WriteLine("authentication : " + authenticated); 
     Authentication = authenticated; 
    } 

}

Proxy類和用戶類是在一個單獨的客戶端應用程序:

public class Proxy : IService 
{ 
    public Proxy(InstanceContext context) 
    { 
     init(context);   
    } 

    private void init(InstanceContext context) 
    { 
     NetTcpBinding binding = new NetTcpBinding(); 
     binding.Security.Mode = SecurityMode.None; 
     binding.Security.Mode = SecurityMode.Transport;  

     // binding.CloseTimeout = TimeSpan.FromSeconds(1); 
     // binding.OpenTimeout = TimeSpan.FromSeconds(2); 
     // binding.ReceiveTimeout = TimeSpan.FromSeconds(15); 
     // binding.SendTimeout = TimeSpan.FromSeconds(15); 

     DuplexChannelFactory<IService> channel = new DuplexChannelFactory<IService>(context, binding, new EndpointAddress("net.tcp://localhost:4242")); 
     service = channel.CreateChannel(); 
    } 

    public void Login(string email, string password) 
    { 
     service.Login(email, password); 
    } 

    public void Logout(int id) 
    { 
     service.Logout(id); 
    } 
} 

public class User 
{ 
    Client client; 
    IService service; 

    public User() 
    { 
     client = new Client(); 
     InstanceContext context = new InstanceContext(client); 
     service = new Proxy(context); 
    } 

    public void Login(string email, string password) 
    { 
     service.Login(email, password); 
     bool valid = client.Authentication; 
     if(valid) Console.WriteLine("Login successful"); 
    } 
} 

這是我開始我的ServiceHost在我的服務器應用程序:

public class Server 
{ 

    public static void Main(string[] args) 
    { 
     Service service = new Service(); 
     ServiceHost host = host = new ServiceHost(service, new Uri("net.tcp://localhost:4242")); 
     host.Open(); 

     Console.WriteLine("opened server ..."); 
     Console.ReadLine(); 
    } 
} 
+0

如果你已經知道了答案,最好將答案作爲答案發布並標記爲答案,而不是編輯原始帖子和標題。 – lgaud

回答

0

我使用NetTcpBinding解決了這個問題。上面的代碼現在正在工作。