【问题标题】:Implementing wcf with mvc4 entity framework fails invoking method使用 mvc4 实体框架实现 wcf 调用方法失败
【发布时间】:2013-08-07 10:30:16
【问题描述】:

我有一个 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 中的问题,但没有帮助。 那么如何解决这个问题。 谢谢

【问题讨论】:

  • 你试过调试你的GetBooksList()方法吗?
  • 您是否尝试过使用WCF Test Client 直接与您的 WCF 服务通信?
  • @lazyberezovsky 是的,如果该方法在控制器中未作为服务调用,则该方法可以正常工作。
  • @Veleous 是的,我已经用 WCF 测试客户端对其进行了测试,使用第二种方法测试很好,但第一种方法会出错。
  • @ElAmorZeewon - 你是如何实现你的服务代理的,你能提供一些代码吗?

标签: c# wcf entity-framework asp.net-mvc-4 dbcontext


【解决方案1】:

我认为这是序列化的问题。从您的业务层进行序列化测试,从实体框架中获取 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;

【讨论】:

  • 您在使用 DataContractSerializer 测试序列化时是否出现异常?了解问题是否是序列化问题很重要。
  • 您也可以像 MSDN 中解释的那样激活 WCF 跟踪:msdn.microsoft.com/en-us/library/ms733025.aspx
【解决方案2】:

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

context.Configuration.ProxyCreationEnabled = false;

【讨论】:

    猜你喜欢
    • 2012-07-30
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多