2014-03-28 35 views
0

這是我寫的客戶端和服務器端的第一個WCF服務項目。我來自Windows窗體背景。 我想我一直有包/接收緩衝區大小的問題,但我不知道如何測試我的app.config是否正常工作或我做錯了什麼。我的app.config工作嗎?截斷數據

客戶項目的app.config設置如下,它的testproj.exe.config反映正確

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="WSHttpBinding_IPulseWebService" 
       closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" 
      messageEncoding="Text" textEncoding="utf-8" 
      useDefaultWebProxy="true"> 
      <readerQuotas 
    maxArrayLength="2147483647" 
    maxBytesPerRead="2147483647" 
    maxDepth="2147483647" 
    maxNameTableCharCount="2147483647" 
    maxStringContentLength="2147483647" /> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="blah" 
      binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IPulseWebService" 
      contract="ServiceReference1.IPulseWebService" name="WSHttpBinding_IPulseWebService"> 
      <identity> 
       <dns value="localhst" /> 
      </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 

我的Web服務的webservice.dll.config包含以下service.serviceModel部分

內容
<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="WSHttpBinding_IPulseWebService" 
       closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" 
      messageEncoding="Text" textEncoding="utf-8" 
      useDefaultWebProxy="true"> 
      <readerQuotas 
     maxArrayLength="2147483647" 
     maxBytesPerRead="2147483647" 
     maxDepth="2147483647" 
     maxNameTableCharCount="2147483647" 
     maxStringContentLength="2147483647" /> 
     </binding> 
     </wsHttpBinding> 
     <basicHttpBinding> 
     <binding name="BasicHttpBinding_IPulseWebService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01: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="8192" maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <security mode="None"> 
      <transport clientCredentialType="None" proxyCredentialType="None" 
       realm="" /> 
      <message clientCredentialType="UserName" algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 

    <services> 
    <service name="SmartcentreWcfLib.PulseWebService"> 
     <host> 
     <baseAddresses> 
      <add baseAddress="http://l0calhost:8732/Design_Time_Addresses/SmartcentreWcfLib/PulseWebService/" /> 
     </baseAddresses> 
     </host> 
     <!-- Service Endpoints --> 
     <!-- Unless fully qualified, address is relative to base address supplied above --> 
     <endpoint address="" binding="wsHttpBinding" 
       bindingConfiguration="WSHttpBinding_IPulseWebService" 
       contract="SmartcentreWcfLib.IPulseWebService"> 
     <!-- 
      Upon deployment, the following identity element should be removed or replaced to reflect the 
      identity under which the deployed service runs. If removed, WCF will infer an appropriate identity 
      automatically. 
     --> 
     <identity> 
      <dns value="l0calhost" /> 
     </identity> 

     </endpoint> 
     <!-- Metadata Endpoints --> 
     <!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. --> 
     <!-- This endpoint does not use a secure binding and should be secured or removed before deployment --> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 
    </services> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior> 
     <!-- To avoid disclosing metadata information, 
     set the value below to false and remove the metadata endpoint above before deployment --> 
     <serviceMetadata httpGetEnabled="True" /> 
     <!-- To receive exception details in faults for debugging purposes, 
     set the value below to true. Set to false before deployment 
     to avoid disclosing exception information --> 
     <serviceDebug includeExceptionDetailInFaults="False" /> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

在我的服務器端wcf dll中,我有以下函數就像測試返回一些數據行一樣。每行都是一組存儲在字典中的鍵/值對。每個對象應該是一個簡單的byte []或變量類型。

List<IDictionary<string, object>> IAuditV1.ReadAuditForStaffMember(long staffId, DateTime startDate, 
    DateTime endDate, Int32 recordCount) 
    { 
     List<TableAdminAudit> tempResult = DatabaseInterface.Instance.AuditQueries.ReadAdminAudit(staffId, startDate, 
     endDate, recordCount); 
     return tempResult.Select(record => record.PrepareForWebInterface()).Cast<IDictionary<string, object>>().ToList(); 
    }// function 

在我的客戶端應用程序中,我正在運行以下循環,它簡單地增加了接收記錄的數量。

 Int32 totalRecords = 0; 
     while (true) 
     { 
     results = client.ReadAuditForStaffMember(1, DateTime.MinValue, DateTime.Now, totalRecords); 
     totalRecords += 10; //results.Length; 
     if (totalRecords == 0) break; 
     } 

在返回的緩衝區達到30個記錄大小的第3個循環中,我收到以下錯誤消息。 我查了一下錯誤和論壇建議它與收到整個數據之前的連接關閉,所以更改各種緩衝區大小等。正如你可以從我的配置文件中看到,我已經提高了所有我知道的值到2147483647,但它沒有奏效。 所以我不知道該從哪裏出發。任何人都可以幫忙嗎?

System.ServiceModel.CommunicationException occurred 
    HResult=-2146233087 
    Message=An error occurred while receiving the HTTP response to blah2/Design_Time_Addresses/SmartcentreWcfLib/PulseWebService/. This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). See server logs for more details. 
    Source=mscorlib 
    StackTrace: 
    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.Channels.ClientReliableChannelBinder`1.RequestClientReliableChannelBinder`1.OnRequest(TRequestChannel channel, Message message, TimeSpan timeout, MaskingMode maskingMode) 
     at System.ServiceModel.Channels.ClientReliableChannelBinder`1.Request(Message message, TimeSpan timeout, MaskingMode maskingMode) 
     at System.ServiceModel.Channels.ClientReliableChannelBinder`1.Request(Message message, TimeSpan timeout) 
     at System.ServiceModel.Security.SecuritySessionClientSettings`1.SecurityRequestSessionChannel.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.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs) 
     at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
     at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 
    Exception rethrown at [0]: 
     at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
     at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
     at WcfTester.ServiceReference1.IPulseWebService.ReadAuditForStaffMember(Int64 staffId, DateTime startDate, DateTime endDate, Int32 startIndex) 
     at WcfTester.ServiceReference1.PulseWebServiceClient.ReadAuditForStaffMember(Int64 staffId, DateTime startDate, DateTime endDate, Int32 startIndex) in W:\Projects\pulse.smartcentre.root\pulse.smartcentre\WcfTester\Service References\ServiceReference1\Reference.cs:line 481 
     at WcfTester.Program.Main(String[] args) in W:\Projects\pulse.smartcentre.root\pulse.smartcentre\WcfTester\Program.cs:line 40 
    InnerException: System.Net.WebException 
     HResult=-2146233079 
     Message=The underlying connection was closed: An unexpected error occurred on a receive. 
     Source=System 
     StackTrace: 
      at System.Net.HttpWebRequest.GetResponse() 
      at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 
     InnerException: System.IO.IOException 
      HResult=-2146232800 
      Message=Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. 
      Source=System 
      StackTrace: 
       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) 
      InnerException: System.Net.Sockets.SocketException 
       HResult=-2147467259 
       Message=An existing connection was forcibly closed by the remote host 
       Source=System 
       ErrorCode=10054 
       NativeErrorCode=10054 
       StackTrace: 
         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) 
       InnerException:** 
+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

0

文件something.dll.config是用於從未。您需要將這些設置複製到web.config或servicehost.exe.config文件中。

這就是.NET從第1天開始工作的方式,它並不特定於WCF。考慮一個給定的DLL可以被多個「可執行文件」使用,並且這些DLL中的每一個可能都有不同的設置。

+0

我在哪裏可以找到web.config或servicehost.exe.config?它們不在\ bin \ debug目錄中。 – Czeshirecat

+0

Web.config將位於託管服務的IIS應用程序的根目錄中。 「servicehost.exe.config」將是如果你是自我託管。 –

+0

這是我困惑的地方。我創建了一個WCF庫項目,而不是一個WCF應用程序。可能在某個地方舉個例子。如果我運行它,VS會打開一個WCF測試客戶端。看着我的c:\ inetpub,我什麼都看不到。我不瞭解背景中發生了什麼。 – Czeshirecat