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}";
}
}