我使用 Visual Studio 2010 和 MS SQL Server 2005。我是 WCF 的新手,我正在尝试在开发小型任务管理应用程序时学习。
目前,我有一个解决方案,其中包含两个控制台应用程序 - WCF 服务 - 一个连接到 WCF 服务以测试我的代码的客户端
WCF 服务使用 LINQ to SQL 连接到数据库。我已经实现了一个 OperationContract,它将一些东西插入到 WCF 服务后面的数据库中并且它可以工作。我已经实现了一个 OperationContract,它从 WCF 服务返回一个 GUID 到客户端并且它也可以工作。
当我尝试从 WCF 服务中检索 List 列表时,它失败并出现以下错误:
“接收到 localhost:8000/TaskerTest/Service/operations 的 HTTP 响应时发生错误。这可能是由于服务端点绑定未使用 HTTP 协议。这也可能是由于服务器中止了 HTTP 请求上下文
InnerException:底层连接已关闭:接收时发生意外错误。
我的合同(前两个工作。GetLists 是问题):
[ServiceContract(Namespace = "http://Tasker_Server")]
public interface IOperations {
[OperationContract]
string CreateList(string listName, string text);
[OperationContract]
string UpdateList(int idList, string listName, string text);
[OperationContract]
List<ToDoList> GetLists();
}
实施:
public List<ToDoList> GetLists() {
Guid token = OperationContext.Current.IncomingMessageHeaders.GetHeader<Guid>("token", "ns");
int? userID = CheckCache(token);
if (userID != null) {
List<ToDoList> lst = DBAccess.GetListsByUserId(userID.Value);
return lst;
}
else
return null;
}
数据库访问代码:
public static List<ToDoList> GetListsByUserId(int idCredential) {
TaskerModelDataContext tmdc = new TaskerModelDataContext();
List<ToDoList> lists = tmdc.ToDoLists.Where(entry => entry.id_Credential == idCredential).ToList<ToDoList>();
return lists;
}
以及客户端代码(WCF 服务作为服务引用添加到客户端项目):
TaskerService.LoginClient test2 = new LoginClient();
string username = "usr1", password = "psw1";
test2.ClientCredentials.UserName.UserName = username;
test2.ClientCredentials.UserName.Password = password;
Guid result = Guid.Empty;
try {
result = test2.CheckCredentials(username, password);
Console.WriteLine("Login OK!");
}
catch (Exception e) {
Console.WriteLine(e.Message);
}
TaskerService.OperationsClient client = new OperationsClient();
using(OperationContextScope contextScope = new OperationContextScope(client.InnerChannel)) {
Guid testToken = result; Console.WriteLine(testToken.ToString());
MessageHeader<Guid> mhg = new MessageHeader<Guid>(testToken);
MessageHeader untyped = mhg.GetUntypedHeader("token", "ns");
OperationContext.Current.OutgoingMessageHeaders.Add(untyped);
client.GetLists();
}
client.Close();
客户端因上述异常而失败:client.GetLists();
我可以根据读者的需要提供任何额外的细节。
更新
我已经打开了跟踪
<system.diagnostics>
<trace autoflush="true" />
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="sdt"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData= "SdrConfigExample.e2e" />
</listeners>
</source>
</sources>
</system.diagnostics>
然后我在生成的日志上运行 Microsoft Service Trace Viewer 并收到以下错误:
尝试序列化参数时出错。InnerException 消息是 'Type 'System.DelegateSerializationHolder+DelegateEntry' 与数据协定名称 'DelegateSerializationHolder.DelegateEntry:http://schemas.datacontract.org/2004/07/System' 不是预期的
我现在已将 [DataContract] 添加到我的 dbml 文件中的“ToDoList”类中,现在我没有收到异常。我在我的客户中得到了正确数量的结果,但是每个类的内容似乎都是空的。