我使用EF6具有以下wcf功能:
public Order GetNextOrderNotDownloaded()
{
return _context.Orders
.Include(o => o.OrderLines)
.Where(o => !o.IsDownloaded)
.OrderBy(o => o.DateCreated)
.FirstOrDefault();
}
但是当我尝试在测试客户端中调用它时,我会抛出一个异常,说连接正在终止。通过以下其他帖子,我在web.config中添加了诊断信息,发现异常是
内容类型application / soap + xml; charset = utf-8被发送到期望text / xml的服务;字符集= UTF-8。客户和服务 绑定可能不匹配。
我尝试过各种各样的事情,比如更改web.config中的绑定并删除textEncoding="utf-8"
,然后其他帖子提示它可能是序列化问题,所以我尝试添加[Serializable]
属性到Order
和OrderLines
课程,但也没有。
如果我删除.Include(o => o.OrderLines)
,它会返回Order
对象,但我也需要这些订单。
有谁知道如何解决这个问题?
Web.config绑定:
<basicHttpBinding>
<binding name="basicHttpBinding_Service"
closeTimeout="00:11:00" openTimeout="00:11:00" receiveTimeout="00:10:00" sendTimeout="00:11:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
<message clientCredentialType="UserName" algorithmSuite="Default"/>
</security>
</binding>
</basicHttpBinding>
除此之外,如果我重新创建Order
和Orderline
类而没有指向EF的链接(没有数据注释和虚拟属性),并使用从实体获得的值填充它们,WCF将开始工作,为什么&#34;克隆&#34;课程有效但EF课程不是
答案 0 :(得分:0)
创建一个OrderDTO对象,其中包含Oder属性和IEnumerable of Orderline
Public class OrderDTO
{
Int ID;
//......
IEnumerable<Orderline> Orders;
}
将退货类型更改为OrderDTO
public OrderDTO GetNextOrderNotDownloaded()
在LINQ查询中为Select查询创建lambda表达式,请参阅@ click here 您的最终代码将如下所示。
public OrderDTO GetNextOrderNotDownloaded()
{
return _context.Orders
.Include(o => o.OrderLines)
.Where(o => !o.IsDownloaded)
.OrderBy(o => o.DateCreated)
.Select(o => new OrderDTO { Id = o.Id, Orders = o.OrderLines})
.FirstOrDefault();
}
答案 1 :(得分:0)
text/xml
,而SOAP 1.2使用soap+xml
。在.NET中,BasicHttpBinding使用SOAP 1.1,而WSHttpBinding使用SOAP 1.2。您的测试客户端是否使用WsHttpBinding?
您的服务可以提供支持这两种协议的端点,但您的客户端应该连接到支持他们想要使用的协议版本的端点。