2013-08-05 53 views
0

我創建WCF服務,一切工作正常,但是當我試圖返回類型[](我是從Assembly.GetTypes())我有以下異常:C#WCF服務回報集合

System.ServiceModel.CommunicationException: The underlying connection was closed: The connection was closed unexpectedly. 
---> System.Net.WebException: The underlying connection was closed: The connection was closed unexpectedly. 
    at System.Net.HttpWebRequest.GetResponse() 
    at System.ServiceModel.Channels.HttpChannelFactory.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.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) 

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 ConsoleApplication1.ServiceReference1.IWcfAssembly.GetAssemblyTypes(String a) 
    at ConsoleApplication1.ServiceReference1.WcfAssemblyClient.GetAssemblyTypes(String a) in D:\Projekty\ConsoleApplication1\ConsoleApplication1\Service References\ServiceReference1\Reference.cs:line 50 
    at ConsoleApplication1.Program.Main(String[] args) in D:\Projekty\ConsoleApplication1\ConsoleApplication1\Program.cs:line 17 

我認爲這可能是maxItemsInObjectGraph屬性或maxArrayLenght(和類似),但它沒有幫助。仍然有同樣的例外。也許我在財產申報上做錯了什麼?

這是我的客戶端配置:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="BasicHttpBinding_IWcfAssembly" 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="128" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
         maxBytesPerRead="4096" maxNameTableCharCount="2147483647" /> 
        <security mode="None"> 
         <transport clientCredentialType="None" proxyCredentialType="None" 
          realm="" /> 
         <message clientCredentialType="UserName" algorithmSuite="Default" /> 
        </security> 
       </binding> 
      </basicHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="http://localhost:57040/WcfAssembly.svc" binding="basicHttpBinding" 
       bindingConfiguration="BasicHttpBinding_IWcfAssembly" contract="ServiceReference1.IWcfAssembly" 
       name="BasicHttpBinding_IWcfAssembly" /> 
     </client> 
    </system.serviceModel> 
</configuration> 

,這是我的服務配置:

<?xml version="1.0"?> 
<configuration> 

    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 

     <binding name="BasicHttpBinding_IWcfAssembly" receiveTimeout="00:10:00" sendTimeout="00:10:00" openTimeout="00:10:00" closeTimeout="00:10:00" 
       maxReceivedMessageSize="2147483647" 
       maxBufferSize="2147483647" 
       maxBufferPoolSize="52428899"> 
      <readerQuotas maxDepth="128" 
         maxStringContentLength="2147483647" 
         maxArrayLength="2147483647" 
         maxBytesPerRead="4096" 
         maxNameTableCharCount="2147483647" /> 
      <security mode="None"/> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <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> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 

</configuration> 

我還添加[ServiceBehavior(MaxItemsInObjectGraph = int.MaxValue)]作爲一類屬性。我在之前的服務配置中使用了它,但這是嘗試之一。

你有什麼想法的傢伙?爲什麼從Assembly.GetTypes()返回數組會導致這樣的錯誤? (中間體的大陣列[]作品OK)

+0

如果服務器端的DataContractSerializer無法序列化類型,我會看到該類型的異常。 – rene

回答

0

的問題是,該System.RunTimeType不序列化(這是在內部實行型)

使用此模擬:

void Main() 
{ 
    var dto = new MyDto(); 
    dto.Tada = new Type[] { this.GetType() }; 
    DataContractSerializer ser = 
     new DataContractSerializer(typeof(MyDto)); 

    var ms = new MemoryStream(); 
    ser.WriteObject(ms, dto); 

    ms.Dump(); 
    dto.Dump(); 
} 

public class MyDto 
{ 
    public Type[] Tada { get; set; } 
} 

拋出:

SerializationException:類型 'System.RuntimeType' 數據合同 名 'RuntimeType:http://schemas.datacontract.org/2004/07/System' 是 不是教人口會d。考慮使用DataContractResolver或將未知的任何類型 靜態添加到已知類型的列表中 - 例如,使用KnownTypeAttribute屬性的 或將它們添加到傳遞給DataContractSerializer的已知類型的列表 。

這是有道理的,因爲RunTimeType是內部的(類型本身是抽象的)。你必須想出你自己的序列化類型,可以傳達你想要的信息。

+0

我有一種感覺,這是問題,我害怕這一點。我需要非常多的信息,以便手動序列化它非常困難。不管怎樣,謝謝你 –