2013-08-05 3 views
0

Я создал службу WCF и все работает правильно, но когда я пытаюсь вернуться Type [] (я получил его от Assembly.GetTypes()) я следующее исключением:с коллекцией возвращения # службы 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() вызывает такую ​​ошибку? (Большой массив Int [] работает 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' является не expecte д. Рассмотрите возможность использования DataContractResolver или добавьте любые типы , не известные статически в список известных типов - например, с использованием атрибута KnownTypeAttribute или путем добавления их в список известных типов, переданных DataContractSerializer.

Что имеет смысл, поскольку RunTimeType является внутренним (сам тип является абстрактным). Вы должны придумать свой собственный сериализованный тип, который может передать информацию, которую вы хотите.

+0

У меня было ощущение, что это проблема, и я боялся этого. Мне нужно столько информации, что его очень сложно сериализовать вручную. В любом случае, спасибо –

Смежные вопросы