Ошибка сериализации при отправке таблицы данных в службу WCF - PullRequest
3 голосов
/ 14 ноября 2011

Произошла ошибка при сериализации тела сообщения Метод 1: «Произошла ошибка при создании документа XML.»

Я получаю эту ошибку при попытке передать данныев качестве параметра для метода WCF, я уже использовал методы такого типа (то есть DataTable в качестве параметра) в моей службе WCF, которая работает нормально.

Однако в этом случае, я думаю,Причиной может быть размер DataTable, хотя я не уверен.

Уже пытался увеличить maxReceivedMessageSize, maxBufferSize и maxStringContentLength до 5242880, что составляет 5 МБ (что, я думаю, более чем достаточно), но не повезло.

Нашел много связанных статей, но никто не указывал на эту конкретную проблему, следовательно, опубликовал.

Пожалуйста, руководство.

Update:

My DataTable также содержит некоторое содержимое XML, может ли это быть проблемой, поскольку она сериализуется в формате XML.

Ответы [ 3 ]

6 голосов
/ 14 ноября 2011

У меня была такая же проблема, но потом я понял, что забыл назвать таблицу данных, просто проверьте, не пропускаете ли вы ее ...

DataTable dt = new DataTable();
...
dt.TableName = "Table1";

теперь передайте таблицу как параметр, надеюсьэто помогает

0 голосов
/ 14 ноября 2011

Вот хороший пример того, как увеличить длину сообщения пользовательской веб-службы WCF, размещенной в SharePoint:

using System;
using System.Diagnostics;
using System.ServiceModel;
using System.ServiceModel.Channels;
using Microsoft.SharePoint.Client.Services;

namespace MyNamespace
{
    public class MyFactory : MultipleBaseAddressBasicHttpBindingServiceHostFactory
    {
        protected override ServiceHost CreateServiceHost(Type serviceType,
            Uri[] baseAddresses)
        {            
            ServiceHost host = new MultipleBaseAddressBasicHttpBindingServiceHost(
                serviceType, baseAddresses);

            if (host != null)
            {
                host.Opening += new EventHandler(OnHost_Opening);
            }

            return host;
        }

        private void OnHost_Opening(object sender, EventArgs e)
        {
            Debug.Assert(sender != null);
            ServiceHost host = sender as ServiceHost;
            Debug.Assert(host != null);

            // Configure the binding values
            if (host.Description != null && host.Description.Endpoints != null)
            {
                foreach (var endPoint in host.Description.Endpoints)
                {                    
                    if (endPoint != null && endPoint.Binding != null)
                    {
                        BasicHttpBinding basicBinding = endPoint.Binding
                            as BasicHttpBinding;

                        if (basicBinding != null)
                        {
                            ConfigureBasicHttpBinding(basicBinding);
                        }
                    }
                }
            }
        }

        private static void ConfigureBasicHttpBinding(BasicHttpBinding basicBinding)
        {
            Debug.Assert(basicBinding != null);
            basicBinding.MaxReceivedMessageSize = Int32.MaxValue;
            basicBinding.ReaderQuotas.MaxArrayLength = Int32.MaxValue;
            basicBinding.ReaderQuotas.MaxBytesPerRead = Int32.MaxValue;
            basicBinding.ReaderQuotas.MaxStringContentLength = Int32.MaxValue;
        }
    }
}
As you can see I’m setting maximum length of the incoming messages.

Now we need to modify our service svc file to use our custom Factory Configuration:
<%@ ServiceHost Language="C#" Debug="true"
    Service="MyNamespace.MyService, $SharePoint.Project.AssemblyFullName$"  
    CodeBehind="MyService.svc.cs"
    Factory="MyNamespace.MyFactory, $SharePoint.Project.AssemblyFullName$"%>

пример

0 голосов
/ 14 ноября 2011

Попробуйте добавить behavior конфигурацию в ваши App.config файлы (и сослаться на нее в своих службах и конечных точках):

  • На сервере:

    <behaviors>
        <serviceBehaviors>
            <behavior name="MyServiceBehavior">
                <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
    
  • На клиенте:

    <behaviors>
        <endpointBehaviors>
            <behavior name="MyClientBehavior">
                <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
            </behavior>
        </endpointBehaviors>
    </behaviors>
    

Если это не сработает, попробуйте установить максимальные значения для привязки:

<bindings>
    <netTcpBinding>
        <binding name="MyBindingConf" 
                 maxReceivedMessageSize="2147483647" 
                 maxBufferSize="2147483647"
                 maxBufferPoolSize="2147483647"
                 sendTimeout="00:30:00">
            <readerQuotas maxDepth="32" 
                          maxStringContentLength="2147483647" 
                          maxArrayLength="2147483647" 
                          maxBytesPerRead="4096" 
                          maxNameTableCharCount="16384" />
            <security mode="None" />
        </binding>
    </netTcpBinding>
</bindings>
...