如何从安静的 WCF 服务返回对象列表

Posted

技术标签:

【中文标题】如何从安静的 WCF 服务返回对象列表【英文标题】:How do I return a list of objects from a restful WCF service 【发布时间】:2015-02-05 17:04:30 【问题描述】:

我正在尝试从我的宁静 WCF 服务返回一个对象列表。我正在使用实体框架。问题是,当 WCF 服务运行时,如果我在其上放置了调试器,那么调试器会被访问两次,我得到一个 404 server not found 错误。为什么会这样。?

如果我返回一个与其他 class(DB table) 没有关系的单个 class(db table),则它会返回列表,但如果我必须返回 class(DB table),则会收到 404 错误。

界面:

[OperationContract]
[WebInvoke(Method = "GET", UriTemplate = "GetDataString/value",RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
List<Course> GetDataString(string value);

实施:

public List<Course> GetDataString(string value)

    int v = Convert.ToInt32(value);
    TestEntities1 t = new TestEntities1();
    List<Course> u = t.Courses.ToList();
    return u;

可能是什么问题。?这里Coursesstudent table 对齐。

当我编写用于获取相同数据的 ADO.NET 代码时,它工作得很好。

然后在调试器执行两次后,我得到一个找不到服务器的错误页面,并且 URL 发生了变化

http://localhost:5127

http://www.localhost.com:5127/Service1.svc/GetDataString/1/Service1.svc/GetDataString/1

我也启用了跟踪,我得到了以下异常。我不知道这个例外是什么。请帮忙。

System.Runtime.Serialization.SerializationException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

堆栈跟踪中的异常消息:

Type 'System.Data.Entity.DynamicProxies.Course_4B21E9E950AEFDC2233FE771C1BFE0ABF63D591A6487C93CBD145965FB96EA11' with data contract name 'Course_4B21E9E950AEFDC2233FE771C1BFE0ABF63D591A6487C93CBD145965FB96EA11:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

以下是我的课程:

namespace JSONWebService

    [DataContract]
    public partial class course
    
        public Course()
        
            this.Students = new HashSet<Student>();
        

        [DataMember]
        public int C_Id  get; set; 

        [DataMember]
        public string C_Name  get; set; 

        public virtual ICollection<Student> Students  get; set; 
    

【问题讨论】:

您的网络浏览器似乎找不到正在监听 localhost:5127 的网络服务器。确保它正在运行。 (在 VS 中按 F5 或 Ctrl+F5)。) @abatishchev :不,当我编写用于获取相同数据的 ADo.net 代码时,它工作得很好。 获取数据的方式与 Web 服务器的可用性无关。仔细检查它是否正在运行。例如,放置一个断点并确保它被命中。 另外你可能会得到一个异常杀死网络服务器进程,这是很有可能的。 无论如何,调试你的应用程序。查找导致异常的行(如果有)。 【参考方案1】:

您的服务不知道如何序列化 course 类。你添加了[DataContract][DataMember] 属性吗?你能发布它的外观吗?

【讨论】:

我已将它添加到课程中。我需要将其添加到课程班或学生班吗? @user2998990 您还需要将[DataContact][DataMember] 添加到学生班级,否则需要添加[KnownType(typeof(student)] 属性 @CoderofCode : [KnownType(typeof(student)] on student class or course.? @CoderofCode,tchrikch :我还没有编写类。当我添加实体数据模型(edmx)时,这些类是自动生成的。请帮忙。没有任何效果。【参考方案2】:

默认情况下,您不能在 WCF 服务器和客户端之间传输对象作为其基本类型。 DataContractSerializer 在尝试序列化基类时会抛出异常,您可以在here 中找到有关您的问题的好文章

【讨论】:

Ado.net 没有问题,因为它不与类交互..?仪式..??因为使用 ado.net 给了我正确的结果。 WCF 使用序列化将数据从服务器传输到客户端。但 Ado.net 没有。 WCF 和 ADo.net 是完全不同的概念。 Ado.net 用于从 DB 获取数据,WCF 用于将数据从一端传输到另一端。 我知道.. 我的意思是.. 在 WCF 服务本身而不是使用 EF 和 LINQ 中,我使用 ado.net 代码(存储过程)来获取数据并存储由数据集中的 SP 并将其转换为列表然后返回。在这种情况下,一切正常

以上是关于如何从安静的 WCF 服务返回对象列表的主要内容,如果未能解决你的问题,请参考以下文章

WCF REST JSON 返回动态列表

如何从 WCF 服务返回 xml 响应

如何从 WCF 数据服务返回复杂类型?

如果两个对象的背景颜色匹配,如何生成新的背景颜色?

如何从 WCF 服务返回 multipart/form-data 作为响应

如何创建返回文件(.xlsx)的 WCF 服务