0
我有一個自託管的WCF服務,具有點對點綁定。我正在使用DuplexChannel獲取響應。與ServiceHost的連接正在工作,但是當回調被調用時,即使我沒有使用任何TransactionFlowProperties,我也會得到上面提到的ArgumentException
。WCF: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();
}
}
如果你已經知道了答案,最好將答案作爲答案發布並標記爲答案,而不是編輯原始帖子和標題。 – lgaud