1

我有一个 wcf 应用程序,我在其中使用了实体框架并实现了 dbContext 来查询数据库。当我在浏览器中查看 svc 文件时,它会公开操作。

我有这样的接口类:

    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
       List<BooksModels> GetBooksList();

        [OperationContract]
        BooksModels GetBook(int id);

    }

我在 svc.cs 文件中有这样的实现

    public List<BooksModels> GetBooksList()
    {
        MVCEntity en = new MVCEntity();
      return  en.book.ToList();

    }

    public int GetBookId(int id)
    {
        //return db.book.Find(id);
        return 1;
    }

BooksModels 类是这样的

[DataContract]
    public class BooksModels
        {
            [Key]
            [DataMember]
            public int BookId { get; set; }
            [DataMember]
    public string BookName{get;set;}
    }

并将配置文件设置为创建 wcf 服务应用程序时创建的默认文件。

但是当我从 MVC wcf 客户端调用 GetBooksList 服务时,它给了我以下错误:

调用服务失败。可能原因:服务离线或无法访问;客户端配置与代理不匹配;现有代理无效。有关更多详细信息,请参阅堆栈跟踪。您可以尝试通过启动新代理、恢复到默认配置或刷新服务来恢复。

但是当我调用返回 1 的第二种方法时。

我检查了当服务使用 dbContext 返回数据时它会给出错误并且在没有时很好。

我浏览了各种博客以及stackoverflow中的问题,但没有帮助。那么如何解决这个问题。谢谢

4

2 回答 2

0

我认为这是序列化的问题。从您的业务层进行序列化测试,从实体框架中获取 List 并进行序列化,然后对其进行反序列化并在序列化前后进行比较。

使用 DataContractSerializer :

DataContractSerializer serialiser = new DataContractSerializer(typeof(List<BooksModels>));
List<BooksModels> expected = business.GetBooksList();
Stream stream = new MemoryStream();
serialiser.WriteObject(stream, expected);
stream.Position = 0;
List<BooksModels> actual = serialiser.ReadObject(stream) as List<BooksModels>;
Assert.IsNotNull(actual);
Assert.AreEqual(expected.Prop1, actual.Prop1);
Assert.AreEqual(expected.Prop2, actual.Prop2);
// ... //

如果它不起作用,您可能在实体框架中使用代理。关闭代理:

context.ContextOptions.ProxyCreationEnabled = false;
于 2013-08-07T12:37:39.163 回答
0

我有同样的问题。感谢 Brice2Paris,我通过关闭 EF 代理解决了这个问题:

context.Configuration.ProxyCreationEnabled = false;
于 2015-07-01T08:34:02.223 回答