WCF抛出类型不匹配错误

时间:2014-10-23 11:02:04

标签: c# entity-framework wcf utf-8

我使用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]属性到OrderOrderLines课程,但也没有。

如果我删除.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>

除此之外,如果我重新创建OrderOrderline类而没有指向EF的链接(没有数据注释和虚拟属性),并使用从实体获得的值填充它们,WCF将开始工作,为什么&#34;克隆&#34;课程有效但EF课程不是

2 个答案:

答案 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)

SOAP 1.1使用

text/xml,而SOAP 1.2使用soap+xml。在.NET中,BasicHttpBinding使用SOAP 1.1,而WSHttpBinding使用SOAP 1.2。您的测试客户端是否使用WsHttpBinding?

您的服务可以提供支持这两种协议的端点,但您的客户端应该连接到支持他们想要使用的协议版本的端点。