2016-05-30 82 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解决了这个问题。上面的代码现在正在工作。