2013-10-22 18 views
14

Tôi lấy dữ liệu từ một dịch vụ WCF web và khi dữ liệu là hơn 0,2 triệu hồ sơ tôi nhận được một ngoại lệ mà là như dưới:System.ServiceModel.CommunicationException: Kết nối tiềm ẩn đã được đóng

System.ServiceModel.CommunicationException: The underlying connection was closed: A connection that was expected to be kept alive was closed by the server. ---> System.Net.WebException: The underlying connection was closed: A connection that was expected to be kept alive was closed by the server. ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host 
at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) 
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) 
--- End of inner exception stack trace --- 
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) 
at System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size) 
at System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead) 
--- End of inner exception stack trace --- 
at System.Net.HttpWebRequest.GetResponse() 
at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 
--- End of inner exception stack trace --- 

Server stack trace: 
at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason) 
at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 
at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout) 
at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout) 
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 

web của tôi .config trông giống như sau:

<basicHttpBinding> 
    <binding name="BasicHttpBinding_IService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" 
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
      messageEncoding="Text" textEncoding="utf-8" transferMode="StreamedResponse" 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> 
    <binding maxReceivedMessageSize="2147483647" allowCookies="true"> 
    <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
maxNameTableCharCount="2147483647" /> 
    </binding> 
</basicHttpBinding> 

Tôi chắc chắn rằng dịch vụ web của tôi đang truy xuất dữ liệu từ DB. nhưng không thể chuyển sang web của tôi từ nơi tôi bắt đầu cuộc gọi. Cảm ơn trước sự giúp đỡ nào.

+0

Tăng thời gian chờ kết nối trong tệp cấu hình của bạn. – gleng

+0

Tăng maxBufferSize, maxReceivedMessageSize trong các liên kết được đề cập trong Web.config –

Trả lời

15

Gần đây, tôi đã gặp sự cố tương tự với dịch vụ Wcf trong ứng dụng web .Net 4.0. Tôi tăng giá trị maxItemsInObjectGraph và máy chủ không ném ngoại lệ nữa. Các tài liệu here nói tối đa mặc định là Int32.MaxValue nhưng tôi nghĩ rằng đó là không chính xác, giá trị tối đa là 65535.

<serviceBehaviors> 
    <behavior name="ServiceBehaviour"> 
     <dataContractSerializer maxItemsInObjectGraph="6553500"/> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 

Một điều khác bạn có thể làm là cho phép truy tìm. Đây là ví dụ về những gì tôi có trong web.config:

<system.diagnostics> 
    <sources> 
    <source name="System.ServiceModel" 
      switchValue="Information, ActivityTracing" 
      propagateActivity="true"> 
     <listeners> 
     <add name="traceListener" 
      type="System.Diagnostics.XmlWriterTraceListener" 
      initializeData= "c:\temp\log\Traces.svclog" /> 
     </listeners> 
    </source> 
    </sources> 
</system.diagnostics> 

Nếu bạn nhấp đúp vào Traces.svclog, cửa sổ sẽ mở Trình theo dõi dịch vụ Microsoft.

Nếu bạn kiểm tra dịch vụ của mình với Microsoft WCF Test Client, hãy đảm bảo bạn thay đổi cấu hình máy khách mặc định để khớp với cài đặt máy chủ (điều này bao gồm hành vi điểm cuối của máy khách) để đảm bảo máy khách có thể nhận phản hồi từ máy chủ.

Tôi hy vọng điều này sẽ hữu ích.

+0

Tôi gặp vấn đề tương tự như OP, thêm '' đã khắc phục sự cố cho tôi. –

+1

Tôi cũng gặp vấn đề tương tự. Sử dụng tracelog dịch vụ tôi đã tìm thấy một lỗi serialization của lớp DTO của tôi ... – GiveEmTheBoot

+0

tài liệu trong liên kết là lớp System.Runtime.Serialization. Đây là liên kết đến hành vi dịch vụ, hiển thị tối đa là 65536 http://msdn.microsoft.com/en-us/library/ms731809(v=vs.100).aspx – mmeasor

2

Làm cho khách hàng của bạn cơ bảnHttpBinding giống như ràng buộc máy chủ của bạn. Đây là một lỗi phổ biến verry chỉ thay đổi một ràng buộc thay vì máy chủ và khách hàng ràng buộc.

Nếu đó không phải làm việc bạn có thể bật WCF tracing: wcf tracing

Điều đó sẽ cung cấp cho bạn nhiều hiểu biết sâu sắc trong vấn đề thuộc hạ là gì.

0

chúng tôi đã có một vòng lặp trong biểu đồ đối tượng của chúng tôi đang trở lại. Tôi biết điều này có lẽ không phải là vấn đề của bạn nhưng tôi thêm nó ở đây trong trường hợp bất cứ ai khác có cùng một vấn đề. Chúng tôi đã kích hoạt tính năng includeExceptionDetailInFaults nhưng không nhận được lỗi trong bất kỳ ứng dụng khách nào (ứng dụng của chúng tôi hoặc WCF Test Client). May mắn là nó xuất hiện trong nhật ký máy chủ để chúng tôi có thể tìm thấy nó theo cách đó.

Chúng tôi có cha mẹ -> con và con -> cha mẹ cho điều hướng hai chiều, chúng tôi phải ngắt liên kết đó và thay vào đó có cha mẹ -> con và đứa trẻ có id để tra cứu cha mẹ, sau đó lỗi xảy ra xa.

Hy vọng điều này sẽ giúp ai đó!

0

Thêm cấu hình sau vào cấu hình dịch vụ wcf của bạn. Và xem c: \ log \ Traces.svclog tập tin. Ngoại lệ của tôi bị ném;

Đã xảy ra lỗi khi cố gắng tuần tự hóa thông số Thông báo InnerException là 'Giá trị enum' 0 'không hợp lệ đối với loại' ThyCams2014.XrmBase.new_filingstatu 'và không thể được tuần tự hóa. Đảm bảo rằng các giá trị enum cần thiết có mặt và được đánh dấu bằng thuộc tính EnumMemberAttribute nếu loại có DataContractAttribute mã attrienter herebute. '. Vui lòng xem InnerException để biết thêm chi tiết.

<configuration> 
    <system.diagnostics> 
     <sources> 
      <source name="System.ServiceModel" 
        switchValue="Information, ActivityTracing" 
        propagateActivity="true"> 
      <listeners> 
       <add name="traceListener" 
        type="System.Diagnostics.XmlWriterTraceListener" 
        initializeData= "c:\log\Traces.svclog" /> 
      </listeners> 
     </source> 
     </sources> 
    </system.diagnostics> 
</configuration> 
Các vấn đề liên quan