The error message is kind of misleading here. The session id in this case won't expire on timeout, I guess it's the endpoint url that needs to be set. (Not sure). Instead of trying to understand what's causing the issue, I solved it by catching the FaultException(code below) and invoking the login again. It worked like a charm.
catch (FaultException ex)
{
if (ex.Code.Name == "INVALID_SESSION_ID")
{
Login();
//call your method again.
};
}