One benefit of using the Service Reference is that it opens up the use of async...await. This just makes any async stuff less clunky. For example, in WSDL world, you have to do stuff like this:
private void WSDLLogonAsync()
{
WebService ws = new WebService();
ws.logonCompleted += Ws_logonCompleted;
ws.logonAsync("Admin", "");
}
private void Ws_logonCompleted(object sender, logonCompletedEventArgs e)
{
((WebService)sender).SessionHeaderValue = new SessionHeader() { sessionId = e.Result.sessionid };
}
(yes, in reality you'd probably use an anonymous delegate for logonCompleted, but my point still stands).
In WCF world we can do this:
private async void WCFLogonAsync()
{
WCF.WebServiceSoapPortClient client = new WCF.WebServiceSoapPortClient();
var logonTask = await client.logonAsync("Admin", "");
WCF.SessionHeader header = new WCF.SessionHeader();
header.sessionId = logonTask.result.sessionid;
}