I've got a WCF service that offers a Login method. A client is required to call this method (due to it being the only IsInitiating=true). This method should return a string that describes the success of the call in any case. If the login failed, the connection should be closed.
The issue is with the timing of the close. I'd like to send the return value, then immediately close the connection.
string Login (string name, string pass)
{
if (name != pass) {
OperationContext.Current.Channel.Close ();
return "fail";
}
else {
return "yay";
}
}
The MSDN states that calling Close
on the channel
causes an ICommunicationObject to gracefully transition from the Opened state to the Closed state. The Close method allows any unfinished work to be completed before returning. For example, finish sending any buffered messages).
This did not work for me (or my understanding is wrong), as the close is executed immediately - WCF does not wait for the Login method to finish executing and return a string but closes the connection earlier.
Therefore I assume that calling Close does not wait for the running method to finish. Now, how can I still return a value, then close?
In my desperation I tried the following, but it is hardly a serious solution.
new Thread (() => {
Thread.Sleep (100);
OperationContext.Current.Channel.Close ();
}).Start ();