WCF服务,Azure SQL数据库和ContentType / Binding错误

时间:2014-03-01 15:31:51

标签: c# .net wcf azure wcf-binding

我有一个简单的WCF服务,有两个OperationContracts

public IEnumerable<string> GetDrivers()
    {
        return new List<string>() { "Senna", "Mansell", "Prost" };
    }

    public IEnumerable<DriverDto> GetRealDrivers()
    {
        using (var ctx = new F1Entities())
        {
            var result = from d in ctx.Drivers select new DriverDto { Name = d.Name, Cost = d.Cost, Team = d.Team };
            return result;

        }
    }

{1}}对象是Azure SQL数据库的F1EntitiesdbContext类具有DriverDto属性,DataContractNameTeam具有Cost属性

在本地调试服务并使用WCF测试客户端时,我从GetDrivers获得了正确的响应。当我调用GetRealDrivers但我收到错误时。

  

接收HTTP响应时发生错误   DataMember。这可能是由于   服务端点绑定不使用HTTP协议。这也可以   是由于服务器中止了HTTP请求上下文   (可能由于服务关闭)。请参阅服务器日志了解更多   细节。服务器堆栈跟踪:at   System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(引发WebException   webException,HttpWebRequest请求,HttpAbortReason abortReason)at   System.ServiceModel.Channels.HttpChannelFactory http://localhost:58059/Service1.svc 1.HttpRequestChannel.HttpChannelRequest.WaitForReply(时间跨度   timeout)内部异常:无法从传输中读取数据   连接:远程强制关闭现有连接   主办。在System.Net.Sockets.NetworkStream.Read(Byte []缓冲区,Int32   System.Net.PooledStream.Read(Byte []缓冲区的偏移量,Int32大小),   Int32偏移,Int32大小)at   System.Net.Connection.SyncRead(HttpWebRequest请求,布尔值   userRetrievedStream,Boolean probeRead)内部异常:现有的   连接被远程主机强行关闭   System.Net.Sockets.Socket.Receive(Byte []缓冲区,Int32偏移量,Int32   size,SocketFlags socketFlags)at   System.Net.Sockets.NetworkStream.Read(Byte []缓冲区,Int32偏移量,   Int32尺寸)

调试服务我看到它正确使用上下文并使用DriverDto类型的对象填充结果变量 - 所有这些都具有正确的名称,成本和团队值。所以它正好连接到SQL db。

我已经看到了很多关于这个错误的问题,但是花了很多时间跟着它们,我觉得我错过了一些更明显的东西。

添加日志记录我在日志中发现异常错误,如下所示:

  

内容类型application / soap + xml; charset = utf-8被发送到服务   期待text / xml;字符集= UTF-8。客户端和服务绑定可以   不匹配。

花费更多时间试图找到底部错误导致脑部崩溃。 我的服务Web.config没有任何绑定属性,但仍适用于简单的GetDrivers调用。我在网络配置中遗漏了什么吗?这是使用Azure Cloud Service的VS2013模板创建的。

1 个答案:

答案 0 :(得分:1)

例如,您必须首先使用ToList()将它们存储在内存中,因为上下文在序列化完成之前处理。出于调试目的,您可以将includeExceptionDetailsInFault=true添加到服务器web.config。

示例:

public IEnumerable<DriverDto> GetRealDrivers()
{
    using (var ctx = new F1Entities())
    {
        var result = from d in ctx.Drivers
                     select new DriverDto 
                     {
                         Name = d.Name,
                         Cost = d.Cost,
                         Team = d.Team
                     };
        return result.ToList();
    }
}

Web.Config中:

<system.serviceModel>
    <behaviors>
        <serviceBehaviors>
            <behavior>
                <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>