服务器没有提供有意义的回复;这可能是由于合同不匹配,过早的会话关闭或内部错误造成的 服务器错误
我必须告诉我,当我选择了数千条记录时它仍然可以正常工作,但是当数据很大时,我会收到这个错误,但是在它工作正常之前!
private static string ConnString = "Server=127.0.0.1; Port=5432; Database=DBname; User Id=UName; Password=MyPassword;"
DataTable myDT = new DataTable();
NpgsqlConnection myAccessConn = new NpgsqlConnection(ConnString);
myAccessConn.Open();
string query = "SELECT * FROM Twitter";
NpgsqlDataAdapter myDataAdapter = new NpgsqlDataAdapter(query, myAccessConn);
myDataAdapter.Fill(myDT);
foreach (DataRow dr in myDT.Rows)
{
**WHEN I HAVE TOO MANY RECORDS IT STOPS HERE**
...
的web.config
<configuration>
<system.web>
<compilation debug="false" targetFramework="4.0" />
<httpRuntime maxRequestLength="2147483647" executionTimeout="100000" />
</system.web>
<system.diagnostics>
<trace autoflush="true" />
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="Traces4.svclog"/>
</listeners>
</source>
</sources>
</system.diagnostics>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IDBService" closeTimeout="00:30:00"
openTimeout="00:30:00" receiveTimeout="00:30:00" sendTimeout="00:30:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
messageEncoding="Text" textEncoding="utf-8" transferMode="Streamed"
useDefaultWebProxy="true">
<readerQuotas maxDepth="2147483647" 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>
</bindings>
<client>
<endpoint address="" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IDBService" contract="DBServiceReference.IDBService"
name="BasicHttpBinding_IDBService" />
</client>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<dataContractSerializer maxItemsInObjectGraph="2147483646" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="false" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
</configuration>
客户端配置(已编辑)
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IRouteService" maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647">
<security mode="None" />
</binding>
<binding name="BasicHttpBinding_IDBService" closeTimeout="00:30:00"
openTimeout="00:30:00" receiveTimeout="00:30:00" sendTimeout="00:30:00"
maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"
transferMode="Buffered" >
<security mode="None" />
</binding>
</basicHttpBinding>
<customBinding>
<binding name="CustomBinding_IRouteService">
<binaryMessageEncoding />
<httpTransport maxReceivedMessageSize="2147483647"
maxBufferSize="2147483647" />
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IRouteService"
contract="BingRoutingService.IRouteService" name="BasicHttpBinding_IRouteService" />
<endpoint address="http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc/binaryHttp"
binding="customBinding" bindingConfiguration="CustomBinding_IRouteService"
contract="BingRoutingService.IRouteService" name="CustomBinding_IRouteService" />
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IDBService"
contract="DBServiceReference.IDBService" name="BasicHttpBinding_IDBService" />
</client>
</system.serviceModel>
</configuration>
在我的文件 scvlog 中,我没有任何异常! 我没有任何其他想法我还能做些什么才能理解问题出在哪里。 请有人帮助我!!!
答案 0 :(得分:13)
一个不同的答案,以防任何人到达这里,因为我一直在寻找问题的一般答案。
似乎执行驴工作的DataContractSerializer非常挑剔,但并不总是将真正的错误传递给客户端。服务器进程在发生故障后直接死亡 - 因此无法找到错误。在我的情况下,问题是用作标志的枚举,但没有用[Flags]属性修饰(挑剔或什么!)。
为了解决这个问题,我创建了一个序列化程序实例并检查了调试器中的错误;这是一个代码片段,因为我有它。
编辑:回复评论中的请求...
修改了代码片段以显示我现在使用的辅助方法。与以前大致相同,但是在一个方便的通用包装中。
public static T CheckCanSerialize<T>(this T returnValue) {
var lDCS = new System.Runtime.Serialization.DataContractSerializer(typeof(T));
Byte[] lBytes;
using (var lMem1 = new IO.MemoryStream()) {
lDCS.WriteObject(lMem1, returnValue);
lBytes = lMem1.ToArray();
}
T lResult;
using (var lMem2 = new IO.MemoryStream(lBytes)) {
lResult = (T)lDCS.ReadObject(lMem2);
}
return lResult;
}
要使用它,而不是返回一个对象,在调用helper方法后返回该对象,所以
public MyDodgyObject MyService() {
... do lots of work ...
return myResult;
}
变为
public MyDodgyObject MyService() {
... do lots of work ...
return CheckCanSerialize(myResult);
}
在服务停止关注之前,会引发序列化中的任何错误,因此可以在调试器中进行分析。
请注意;我不建议将调用留在生产代码中,它有序列化和反序列化对象的开销,一旦代码被调试就没有任何实际好处。
希望这有助于某人 - 我浪费了大约3个小时试图追踪它。
答案 1 :(得分:8)
我不知道它是否真的可以作为答案,但我尝试将 web.config 从<security mode="None" />
更改为<security mode="Transport" />
并且它有效!! !
我想要注意,只应在 web.config 中更改此部分,并且客户端配置仍为<security mode="None" />
,因为在两者中都有传输它不起作用!
所以在那之后,我决定再次回到None security
并且它工作了几分钟然后再次停止,它又回来了错误:
服务器未提供有意义的回复;这可能是由合同不匹配,过早的会话关闭或内部服务器错误引起的
security mode to Transport
答案 2 :(得分:5)
就我而言,我正在开发一个与WCF Web服务通信的Windows应用程序项目。 Web服务使用netTcpBinding返回一个Stream对象(图片)。
由于Windows应用程序没有配置文件,因此默认值用于绑定。只需在客户端后端代码扩展MaxReceivedMessageSize就可以解决我的问题。
var API = new StreamService.StreamServiceClient(
new System.ServiceModel.NetTcpBinding(System.ServiceModel.SecurityMode.None)
{
MaxReceivedMessageSize = 2147483647
},
new System.ServiceModel.EndpointAddress("net.tcp://machine/app/service.svc")
);
答案 3 :(得分:3)
有时,此问题是由于绑定中的默认值而导致的超大邮件引起的。
你应该为app.config文件中的绑定添加 maxReceivedMessageSize,maxBufferPoolSize和maxBufferSize 以及足够大的值 - 这应该可以解决问题:)
示例:
<bindings>
<netTcpBinding>
<binding
name="ExampleBinding" closeTimeout="00:01:00"
maxReceivedMessageSize="73400320"
maxBufferPoolSize="70000000"
maxBufferSize="70000000"/>
</netTcpBinding>
</bindings>
祝你好运!
答案 4 :(得分:2)
就我而言,我正在研究MVC应用程序而且我已经改变了
maxReceivedMessageSize ="10000000"
到
maxReceivedMessageSize ="70000000"
它有效!这是因为来自Web服务器的响应超过maxReceivedMessageSize ="10000000"
,
所以我将maxReceivedMessageSize
增加到maxReceivedMessageSize ="70000000"
。
答案 5 :(得分:0)
对我而言,这是从数据库中检索的项目的延迟加载列表。
WCF接收器会尝试迭代它们,这会尝试转到数据库,这显然无法工作。
答案 6 :(得分:0)
根据我对此错误的体验,只需检查服务主机的事件日志,看看实际的根异常是什么。
答案 7 :(得分:0)
在BizTalk中,我们用来解决这个问题。
由于来自服务的消息大小,大多数情况都会发生此问题。所以我们需要将接收消息的大小从65,356增加到2,365,60。它对我有用。
答案 8 :(得分:0)
ASP.NET应用程序可以使用发出请求的用户的Windows身份(用户帐户)执行。模拟通常用于依赖Microsoft Internet信息服务(IIS)来验证用户身份的应用程序中。默认情况下,ASP.NET模拟是禁用的。
启用此功能,您的API将开始工作-它已在IIS身份验证中
答案 9 :(得分:0)
就我而言,从 .NET Framework 4.5 升级到 .NET Framework 4.8 后,我必须删除使用 DataMemberAttribute 修饰的属性的只读修饰符。