Sto usando il seguente codice:Che cosa potrebbe causare l'errore "Impossibile accedere a un oggetto disposto" in WCF?
private WSHttpBinding ws;
private EndpointAddress Srv_Login_EndPoint;
private ChannelFactory<Srv_Login.Srv_ILogin> Srv_LoginChannelFactory;
private Srv_Login.Srv_ILogin LoginService;
L'accesso è il mio costruttore:
public Login()
{
InitializeComponent();
ws = new WSHttpBinding();
Srv_Login_EndPoint = new EndpointAddress("http://localhost:2687/Srv_Login.svc");
Srv_LoginChannelFactory = new ChannelFactory<Srv_Login.Srv_ILogin>(ws, Srv_Login_EndPoint);
}
e sto usando il servizio in questo modo:
private void btnEnter_Click(object sender, EventArgs e)
{
try
{
LoginService = Srv_LoginChannelFactory.CreateChannel();
Srv_Login.LoginResult res = new Srv_Login.LoginResult();
res = LoginService.IsAuthenticated(txtUserName.Text.Trim(), txtPassword.Text.Trim());
if (res.Status == true)
{
int Id = int.Parse(res.Result.ToString());
}
else
{
lblMessage.Text = "Not Enter";
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
Srv_LoginChannelFactory.Close();
}
}
Quando l'utente entra in un nome utente e password validi, tutto va bene. Quando l'utente immette un nome utente e una password errata, il primo tentativo viene visualizzato correttamente il messaggio "Not Enter", ma al secondo tentativo, l'utente vede questo messaggio:
{System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.ServiceModel.ChannelFactory`1[Test_Poosesh.Srv_Login.Srv_ILogin]'.
at System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposed()
at System.ServiceModel.ChannelFactory.EnsureOpened()
at System.ServiceModel.ChannelFactory`1.CreateChannel(EndpointAddress address, Uri via)
at System.ServiceModel.ChannelFactory`1.CreateChannel()
Come posso risolvere il mio codice per evitare che questo errore da verificarsi?
Grazie @Conrad ma cosa strana è che utilizzare questo codice di stile su altre forme ma funzionano correctly.Why Close() metodo Dispose il mio oggetto ? È normale questo comportamento? – Arian
sì, è normale. Chiudi e Disponi tipicamente fanno la stessa cosa. –
I Non capisco veramente. Perché questo codice: LoginService = Srv_LoginChannelFactory.CreateChannel(); gettare un'eccezione? Considerare che lo stato è chiuso, creerò una nuova istanza e lo stato chiuso non è importante – Arian