C# WCF-接收对的HTTP响应时出错http://xxxxx/Service/
我正在我的WCF服务中拨打此电话:C# WCF-接收对的HTTP响应时出错http://xxxxx/Service/,c#,wcf,entity-framework,ef-code-first,C#,Wcf,Entity Framework,Ef Code First,我正在我的WCF服务中拨打此电话: public User GetStudentRecord(string userName) { try { return new DashboardFacade().GetStudentRecord(userName); } catch (Exception ex) { ServiceFault fault = new Ser
public User GetStudentRecord(string userName)
{
try
{
return new DashboardFacade().GetStudentRecord(userName);
}
catch (Exception ex)
{
ServiceFault fault = new ServiceFault();
fault.Operation = "GetStudentRecord";
fault.Reason = "Who knows...";
fault.Message = ex.Message;
throw new FaultException<ServiceFault>(fault, fault.Message, new FaultCode(fault.Reason), fault.Operation);
}
}
ctx是我的DbContext。我首先使用实体框架代码。用户对象如下所示:
public User GetStudentRecord(string userName)
{
User user = ctx.Users.Where(x => x.ADUserName == userName).SingleOrDefault();
return user;
}
public class User
{
public User()
{
//UserDetails = new UserDetail();
}
[Key]
public Guid MasterKey { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string ADUserName { get; set; }
public string UserType { get; set; }
public virtual UserDetail UserDetails { get; set; }
public Nullable<DateTime> LastModifiedDate { get; set; }
}
db.LazyLoadingEnabled = false;
db.ProxyCreationEnabled = false;
在一番咒骂和思考外面的天气有多好之后,找到了根本原因。我从用户对象内部的UserDetails对象中删除virtual关键字 现在它工作了 至于这导致问题的原因,我的假设是序列化或DbContext问题,但我必须对其进行更多研究,不确定 我现在要出去 因此,作为参考,如果您在这里结束时不知道发生了什么,那么在所有其他事项中,您应该查看(大小、超时等):
这些方法对我都不管用。我所做的是在从WCF测试客户机运行时调试服务,并且我能够找到我的问题。这与服务库在app.config中缺少连接字符串有关 如果有人尝试了所有其他方法,但仍然找不到问题,就直接发布。我也有同样的错误 在我的例子中,我有一个带有int列的表,名为OEM。 在模型层中,我有一个类(DTO),该列由枚举表示。 表中有一行OEM列中的值无效。 当我尝试使用LINQ获取所有数据时,有一个错误没有被VisualStudio捕获。
当WCF试图检索消息时出现了这个错误。我遇到了这个问题,在我的例子中,问题是WCF服务返回的类的属性只有一个getter而没有setter。我试图阻止接收者修改该属性。要绕过这个,请看这个
我也有同样的例外,但上面的答案都没有给我一个解决方案。 我通过在web.config中定义跟踪来发现错误:
<system.diagnostics>
<sources>
<source propagateActivity="true" name="System.ServiceModel" switchValue="Information, ActivityTracing">
<listeners>
<add type="System.Diagnostics.DefaultTraceListener" name="Default">
<filter type="" />
</add>
<add initializeData="C:/temp/tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener" name="traceListener">
<filter type="" />
</add>
</listeners>
</source>
</sources>
</system.diagnostics>
我必须做:
var persons = (from p in db.Persons
select new
{
Id = p.Id,
Name = p.Name,
LastName = p.LastName,
Email = p.Email
}
).AsEnumerable()
//construct the complex type outside of DB (to prevent the exception that model cannot be constructed in linq to entities)
.Select(item =>
new Person
{
Id = item.Id,
Name = item.Name,
LastName = item.LastName,
Email = item.Email
}).ToList();
return persons;
如果异常消息更全面,我本可以节省大量时间,从本主题中概述的所有不同原因来看,我想人们会同意我的观点
无论如何,这就是我解决问题的方法,希望这能帮助其他人也许你需要禁用懒散加载和代理创建,如下所示:
public User GetStudentRecord(string userName)
{
User user = ctx.Users.Where(x => x.ADUserName == userName).SingleOrDefault();
return user;
}
public class User
{
public User()
{
//UserDetails = new UserDetail();
}
[Key]
public Guid MasterKey { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string ADUserName { get; set; }
public string UserType { get; set; }
public virtual UserDetail UserDetails { get; set; }
public Nullable<DateTime> LastModifiedDate { get; set; }
}
db.LazyLoadingEnabled = false;
db.ProxyCreationEnabled = false;
执行此操作,您的wcf服务应该可以正常工作。将在哪里引发错误?在调试器中运行服务。刚刚添加了我收到的错误和内部异常消息。我可以在调试器中运行它,它让我逐步完成上面的所有代码。一旦我在实际服务中退出GetStudentRecord()调用,几秒钟后我就得到了错误。我花了整整一天的时间才找到这个答案。非常感谢。那救了我!实际错误是由只读属性引发的,该属性引发空引用异常。。。但这一切都隐藏在内心深处。疯狂!只是来这里发这个。但愿我早一点看到这个。
DataContractSerializer
要求属性有一个setter(尽管它可以接受该setter上的任何访问修饰符),即使只是序列化,而不是反序列化,这对我来说毫无意义。这显然会在某一点上破坏响应,在该点上,它会通过强制关闭连接来做出反应,并向您发送此毫无帮助的错误消息。在我的例子中,我的属性是基于其他属性计算的,我只想将这些计算出的值返回给客户端。旁白:Visual Studio(我猜是svcutil)仍然会为属性创建一个getter和一个setter,而不管您是否声明了setter。需要控制客户端如何使用从您的服务返回的数据可能表明存在更大的设计缺陷。即使您可以阻止设置它,客户机也可以将所有值复制到自己的本地类型中,并在其中修改它想要的任何内容。您的服务可以控制它接受的内容,因此,如果您收到不应该设置的值,您可以忽略它,返回验证错误,对我来说,这是因为我的枚举没有定义0
的显式值,我通过WCF传递了一个对象,该对象具有此枚举类型的属性,但未分配该属性(默认为0
)。
db.LazyLoadingEnabled = false;
db.ProxyCreationEnabled = false;