我有一个简单的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数据库的F1Entities
。 dbContext
类具有DriverDto
属性,DataContract
,Name
和Team
具有Cost
属性
在本地调试服务并使用WCF测试客户端时,我从GetDrivers获得了正确的响应。当我调用GetRealDrivers但我收到错误时。
接收HTTP响应时发生错误
DataMember
。这可能是由于 服务端点绑定不使用HTTP协议。这也可以 是由于服务器中止了HTTP请求上下文 (可能由于服务关闭)。请参阅服务器日志了解更多 细节。服务器堆栈跟踪:at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(引发WebException webException,HttpWebRequest请求,HttpAbortReason abortReason)at System.ServiceModel.Channels.HttpChannelFactoryhttp://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模板创建的。
答案 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>