Message=The underlying connection was closed: The connection was closed unexpectedly.
And my Client:
ServiceReference1.UserServiceClient proxy = new ServiceReference1.UserServiceClient();
string User = proxy.Authenticate("theuser", "somecrypt");
foreach(DataRow userRow in proxy.GetApprovedUser().Tables[0].Rows)
{
Console.WriteLine(string.Format("User: {0}, IsApproved: ", userRow["UserId"], userRow["IsApproved"]));
}
Solution:
Turns out that DataTables are not serializable, so I tried wrapping the DataTable in a DataSet like this:
Interface:
[ServiceContract]
public interface IUserService
{
[OperationContract]
void DoWork();
[OperationContract]
string Authenticate(string userName, string aCryptKey);
[OperationContract]
DataSet GetApprovedUser();
}
Implementation:
public DataSet GetApprovedUser()
{
DataSet ds = new DataSet();
DataTable dt = new DataTable();
ds.Tables.Add(dt);
dt.Columns.Add("UserId", typeof (Int64));
dt.Columns.Add("IsApproved", typeof (bool));
DataRow newUser = dt.NewRow();
newUser["UserId"] = 1000;
newUser["IsApproved"] = true;
dt.Rows.Add(newUser);
newUser = dt.NewRow();
newUser["UserId"] = 1001;
newUser["IsApproved"] = true;
dt.Rows.Add(newUser);
newUser = dt.NewRow();
newUser["UserId"] = 1002;
newUser["IsApproved"] = false;
dt.Rows.Add(newUser);
newUser = dt.NewRow();
newUser["UserId"] = 1003;
newUser["IsApproved"] = true;
dt.Rows.Add(newUser);
return ds;
}
And that fixed it.
For those interested, here was the full stack trace:
Message=The underlying connection was closed: The connection was closed unexpectedly.
Source=mscorlib
StackTrace:
Server stack trace:
at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason)
at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at WCRTestClient.ServiceReference1.IUserService.GetApprovedUser()
at WCRTestClient.ServiceReference1.UserServiceClient.GetApprovedUser() in xxxx\visual studio 2010\Projects\Test WCF\WCRTestClient\Service References\ServiceReference1\Reference.cs:line 64
at WCRTestClient.Program.Main(String[] args) in xxxx\visual studio 2010\Projects\Test WCF\WCRTestClient\Program.cs:line 15
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException: System.Net.WebException
Message=The underlying connection was closed: The connection was closed unexpectedly.
Source=System
StackTrace:
at System.Net.HttpWebRequest.GetResponse()
at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)