C# 用mvc4实体框架实现wcf调用方法失败
我有一个wcf应用程序,其中使用了EntityFramework并实现了dbContext来查询数据库。 当我在浏览器中查看svc文件时,它会公开操作 我有这样的接口类:C# 用mvc4实体框架实现wcf调用方法失败,c#,wcf,entity-framework,asp.net-mvc-4,dbcontext,C#,Wcf,Entity Framework,Asp.net Mvc 4,Dbcontext,我有一个wcf应用程序,其中使用了EntityFramework并实现了dbContext来查询数据库。 当我在浏览器中查看svc文件时,它会公开操作 我有这样的接口类: [ServiceContract] public interface IService1 { [OperationContract] List<BooksModels> GetBooksList(); [OperationContract]
[ServiceContract]
public interface IService1
{
[OperationContract]
List<BooksModels> GetBooksList();
[OperationContract]
BooksModels GetBook(int id);
}
并将配置文件设置为创建wcf服务应用程序时创建的默认配置文件
但是,当我从MVC wcf客户端调用GetBooksList服务时,它会给出以下错误:
未能调用该服务。可能原因:服务处于脱机状态
或无法接近;客户端配置与配置不匹配
代理现有代理无效。有关详细信息,请参阅堆栈跟踪
更多细节。您可以尝试通过启动一个新的代理进行恢复,恢复
默认配置,或刷新服务
但是当我调用第二个返回1的方法时
我检查了当服务使用dbContext返回数据时,它会给出错误和错误信息
不在的时候是好的
我浏览过各种博客,也看过stackoverflow中的问题,但都没有帮助。
那么如何解决这个问题呢。
谢谢我认为这是序列化的问题。从您的业务层进行序列化测试,从实体框架中获取列表并序列化,然后反序列化,并在序列化之前和之后进行比较 使用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);
// ... //
我也有同样的问题。多亏了Brice2Paris,我通过关闭EF的代理解决了这个问题:
context.Configuration.ProxyCreationEnabled = false;
您是否尝试过调试
GetBooksList()
method?您是否尝试过使用@lazyberezovsky直接与WCF服务通信?@lazyberezovsky是的,如果该方法在控制器中未作为服务调用,则该方法工作正常。@Velouse是的,我已使用WCF测试客户端对其进行了测试,第二种方法测试正常,但第一种方法出现错误。@ElAmorZeewon-您是如何实现的您的服务代理,您能提供一些代码吗?当您使用DataContractSerializer测试序列化时是否出现异常?了解问题是否是序列化问题很重要。您也可以激活WCF跟踪,就像MSDN中的解释:
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;
context.Configuration.ProxyCreationEnabled = false;