WCF WebServiceHostFactory MaxReceivedMessageSize конфигурация

у меня естьRESTful веб-сервис WCF называется "Палладиум" как проект в моем решении VS2008. Он размещен в веб-приложении ASP.Net 3.5 с использованиемWebServiceHostFactory реализация через страницу под названием "Palladium.svc".

Мой сервис работает так же, как объяснилВотпосредством чего POST могут быть получены службой вместе с другими параметрами, как определено в URITemplate.

Сервис работает хорошо, и я могу получать размещенную информацию и работать с ней.
Моя проблема возникает, когда данные сообщения превышают 65 КБ, и я получаю следующую ошибку (полученную с помощьюsystem.diagnostics в файле web.config и средства просмотра трассировки служб Microsoft).

Превышен максимальный размер квоты для входящих сообщений (65536). Чтобы увеличить квоту, используйте свойство MaxReceivedMessageSize в соответствующем элементе привязки.

Поскольку служба размещается через реализацию WebServiceHostFactory, для службы установлены привязки по умолчанию, установленные для нее фабрикой. Я попытался переопределить эти привязки, указав параметры привязки и конечные точки в файле web.config. Однако когда я сделал это, я получил сообщение об ошибке:

System.InvalidOperationException, mscorlib, версия = 2.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089

Чтобы запрос в операции LogStartingDetails был потоком, операция должна иметь один параметр, тип которого - Stream.

LogStartingDetails это метод, который я вызываю в моей RESTful службе

Очевидно, чтоLogStartingDetails Метод не должен иметь один параметр, тип которогоStream, как когда фабрика создавала привязки для меня, сервис реагировал хорошо (или, более точно, этоне нужно иметь один параметр, когда фабрика делала за меня работу).

После долгих исследований и столкновения с несколькими кирпичными стенами я решил создать свой собственный класс, который наследует отWebServiceHostFactory и переопределяет некоторые реализации, чтобы указатьMaxReceivedMessageSize собственность на привязку.
Когда я выполняю создание сервиса в классе фабрики с помощью отладки, я вижу транспорт, получающий новыйMaxReceivedMessageSize а такжеMaxBufferSize ценности, но они, кажется, ничего не делают, и я все равно получаю то же самоеThe maximum message size quota for incoming messages (65536) has been exceeded. Исключение

Ниже приведены примеры моего сервисного кода. Если бы кто-то мог помочь мне понять, что я делаю здесь неправильно, это было бы очень ценно.

Palladium.svc (размещено в веб-приложении ASP.Net)

<%@ ServiceHost Language="C#" Debug="true" Service="CDS.PalladiumService.Palladium" Factory="CDS.PalladiumService.MyWebServiceHostFactory" %>

MyWebServiceHostFactory.cs (в проекте CDS.PalladiumService)

using System;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Channels;
using System.ServiceModel.Web;

namespace CDS.PalladiumService
{
    public class MyServiceHost : WebServiceHost
    {
        public MyServiceHost()
        {
        }

        public MyServiceHost(object singletonInstance, params Uri[] baseAddresses)
            : base(singletonInstance, baseAddresses)
        {
        }

        public MyServiceHost(Type serviceType, params Uri[] baseAddresses)
            : base(serviceType, baseAddresses)
        {
        }


        protected override void OnOpening()
        {
            base.OnOpening();

            if (base.Description != null)
            {
                foreach (var endpoint in base.Description.Endpoints)
                {
                    var transport = endpoint.Binding.CreateBindingElements().Find<TransportBindingElement>();
                    if (transport != null)
                    {
                        transport.MaxReceivedMessageSize = 5242880;
                        transport.MaxBufferPoolSize = 5242880;
                    }
                }
            }
        }
    }

    class MyWebServiceHostFactory : WebServiceHostFactory
    {
        protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
        {
            return new MyServiceHost(serviceType, baseAddresses);
        }
    }
}

IPalladium.cs (в проекте CDS.PalladiumService)

using System.IO;
using System.ServiceModel;
using System.ServiceModel.Web;

namespace CDS.PalladiumService
{
    // NOTE: If you change the interface name "IPalladium" here, you must also update the reference to "IPalladium" in Web.config.
    [ServiceContract]
    public interface IPalladium
    {
        [OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = UriTemplate.LogStartingDetails)]
        void LogStartingDetails(string truckId, string palladiumId, Stream postData);
    }
}

Palladium.cs (в проекте CDS.PalladiumService)

using System.IO;
using System.ServiceModel.Activation;

namespace CDS.PalladiumService
{
    // NOTE: If you change the class name "Palladium" here, you must also update the reference to "Palladium" in Web.config.
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Palladium : IPalladium
    {
        public void LogStartingDetails(string truckId, string palladiumId, Stream postData)
        {
            string contents = string.Empty;
            using (var reader = new StreamReader(postData))
            {
                contents = reader.ReadToEnd();
            }

            StreamWriter sw1 =
                File.AppendText(@"C:\log.txt");
            sw1.WriteLine(contents);
            sw1.WriteLine("");
            sw1.Close();

            return;
        }
    }
}

URITemplate.cs (в проекте CDS.PalladiumService)

namespace CDS.PalladiumService
{
    public static class UriTemplate
    {
        public const string LogStartingDetails = "/log-starting/{truckId}/{palladiumId}";
    }
}

Ответы на вопрос(2)

Ваш ответ на вопрос