2012-05-27 44 views
8

我使用Visual Studio 2010和MS SQL Server 2005.我是WCF的新手,我试图在开发时学习小的任务管理应用“无法从传输连接读取数据:现有连接被远程主机强制关闭

目前,我在它里面 有两个控制台应用的解决方案 - WCF服务 - 一个客户端连接到WCF服务来测试我的代码

的WCF服务连接到一个使用LINQ to SQL的数据库 我已经实现了一个OperationContract,它在WCF服务后面的数据库中插入了一些东西,它可以工作。我已经实现了一个OperationContract,它从WCF服务返回一个GUID到客户端,这也起作用。

当我尝试失败,出现以下错误的WCF服务检索目录的列表:8000/TaskerTest /服务/运营:在接收到本地主机的HTTP响应

  • “时发生错误。这可能是由于服务端点绑定不使用HTTP协议造成的,这也可能是由于HTTP请求上下文被服务器中止造成的

  • InnerException:底层连接已关闭:发生意外错误收到。

我的合同(前两项工作。 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; 
    } 

DB访问代码:

 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();

我可以根据读者的需要提供任何其他细节。

UPDATE

我已经变成追踪与

<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服务跟踪查看,并得到了以下错误:

有尝试序列化参数时出错。 InnerException消息是'类型'System.DelegateSerializationHolder + DelegateEntry'与数据合同名称'DelegateSerializationHolder.DelegateEntry:http://schemas.datacontract.org/2004/07/System'不是预期的

我已经添加[DataContract]到我的dbml文件中的“ToDoList”类,现在我没有收到异常。我在客户端得到了正确数量的结果,但每个类的内容似乎都是空的。

回答

2

我的数据库类是使用dbml文件(LINQ to SQL)自动生成的。

在“TaskerModel.designer.cs”(自动生成的文件)中的ToDoList类中添加了[DataContract()]属性后,我没有再收到异常,但是我在客户端上检索到的类只有每个成员的默认值。

然后我添加[数据成员()]属性TodoList的类的所有成员,并添加

[ServiceKnownType(typeof(ToDoList))] 

[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(); 
} 

而现在它的工作原理。不知道是否有更简单的方法来做到这一点,但它现在可行。如果有人知道更好的方法来做到这一点,我将不胜感激评论。

0

我在调用我的WCF restfull服务时发生同样的错误。这个问题似乎是由我作为响应返回的数据类型引起的。

我返回了JSON,我的响应对象有一个数据类型为DateTime的变量。当我用字符串替换DateTime时,问题就消失了,并返回了正确的响应。可能它会帮助那些转而遇到同样问题的人。

替换:

[DataMember] 
public DateTime dateFrom {get;set;} 

与此

[DataMember] 
public string dateFrom {get;set;} 
0

在我的情况下,问题是,有一个只读属性。添加一个空集();并解决我的问题。

相关问题