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