【问题标题】:WCF throwing type mismatch errorWCF 引发类型不匹配错误
【发布时间】:2014-10-23 11:02:03
【问题描述】:

我有以下使用 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 将开始工作为什么“克隆”类可以工作,但 EF 类不能

【问题讨论】:

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


    【解决方案1】:

    创建一个 OrderDTO 对象,其中包含 Oder 属性和 Orderline 的 IEnumerable

    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();
    }
    

    【讨论】:

    • 这有什么帮助? OP 在调用服务时出现问题,而不是执行查询。
    • OP 在他的最后一点中提到“除此之外,如果我重新创建没有指向 EF 的链接的 Order 和 Orderline 类(即没有数据注释和虚拟属性)并使用从实体,WCF 将开始工作。”
    • 我尝试了一个 OrderDTO,但是一旦我添加了订单行,它又失败了
    • 添加订单行是什么意思,你在哪里添加的?您是否在客户端更新了参考?更新客户端代理。
    • 在我的问题结束时,订单和订单线克隆是 dto。我尝试按照您所说的将原始订单线映射到订单 dto,但失败了
    【解决方案2】:

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

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

    【讨论】:

    • 我已添加 https 绑定,但目前无法对其进行测试,因为我的自签名证书在本地无法使用
    猜你喜欢
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    相关资源
    最近更新 更多