1

私の最初のWCFへの進出。このクラスHardDriveは、ローカルに接続されたドライブに関する一連のWMI情報を収集します。List<HardDrive>どういうわけか、それがクライアントに戻ろうとすると、私は

基になる接続が閉じられました:接続が予期せず閉じられました。

これは、まったく役に立たないエラーメッセージの1つです。

ステップバイステップのデバッグを行ったので、リストをクライアントに戻そうとするとクラッシュすることがわかっています。理由はわかりません。

私の最善の推測は、返されたリストのサイズと関係がありますが、...それほど大きくなることはないでしょう、私は思いませんか?

基本的な文字列を返すことをテストしましたが、正常に機能します。

namespace FCopyDataService
{
    public class FCopyDataService : IFCopyDataService
    {
        public List<HardDrive> GetAllHardDrives()
        {
            return HardDrive.GetHardDrives(); //this returns quite happily
        }

        public List<Partition> GetAllPartitions(HardDrive currentDrive)
        {
            return HardDrive.GetPartitions(currentDrive);
        }
    }
}

私はそれをクライアントから次のように呼び出します。

private void button1_Click(object sender, EventArgs e)
{
    FCopyDataServiceClient drives = new FCopyDataServiceClient();
    drives.Open(); //checks it's open
    List<HardDrive> receivedDrives = drives.GetAllHardDrives(); //crashes here
}

私のサービス構成:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime maxRequestLength="102400" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>  
</configuration>

そして、私のクライアント構成は、私がこれを解決しようとしてきたので、いくつかの奇妙なビットがあります。

<system.serviceModel>
          <bindings>
               <basicHttpBinding>
                    <binding name="BasicHttpBinding_IFCopyDataService" closeTimeout="00:01:00"
                         openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                         allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                         maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                         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>
          <client>
               <endpoint address="http://localhost:19140/FCopyDataService.svc"
                    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IFCopyDataService"
                    contract="FCopyDataService.IFCopyDataService" name="BasicHttpBinding_IFCopyDataService" />
          </client>
       <behaviors>
         <endpointBehaviors>
           <behavior>
             <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
           </behavior>
         </endpointBehaviors>
         <serviceBehaviors>
           <behavior >
             <serviceDebug includeExceptionDetailInFaults="true" />
             <serviceMetadata httpGetEnabled="true" />
             <dataContractSerializer maxItemsInObjectGraph="2147483647" />
           </behavior>
         </serviceBehaviors>
       </behaviors>
    </system.serviceModel>
4

1 に答える 1

0

クラスをシリアル化する必要がありましたが、 へのHardDrive循環参照も含まれていましたPartitions

したがって、パーティションの一部としてPartitions含め[DataContract(IsReference=true)]て削除するように変更しました。これは、私の目的には合っているように見えましたが、最善の答えではないと感じています。HardDrives[DataMember]

于 2012-08-21T13:17:11.287 に答える