Указание привязки WCF при использовании ServiceRoute - PullRequest
6 голосов
/ 23 февраля 2011

В настоящее время я регистрирую службу WCF, используя следующий код:

var factory = new DefaultServiceHostFactory();
RouteTable.Routes.Add(new ServiceRoute("XXXEndPoint", factory, IXXXEndPoint)));

Это все хорошо, но мне также нужно изменить свойство MaxStringContentLength в настройках квоты считывателя. Похоже, что используется значение по умолчанию 8192, независимо от моих попыток изменить это, и я предполагаю, что это из DefaultServiceModel?

Существуют ли какие-либо подходящие перехватчики для переопределения этого параметра в DefaultServiceModel, или я должен получать свои собственные классы хост-модели / модели службы, или я поступаю неправильно?

Любые предложения приветствуются.

РЕДАКТИРОВАТЬ: Обратите внимание, что настройка привязки должна выполняться программно (не через файлы конфигурации).

Спасибо

1 Ответ

13 голосов
/ 31 мая 2011

Вы можете сделать это, расширив фабрику хоста.Небольшой модификацией кода ниже вы можете передать дополнительный параметр в WCFServiceHostFactory, чтобы установить его из Global.asax. Я использовал классы ниже, чтобы всегда устанавливать его в Int32.MaxValue

// в Global.asax

routes.Add(new ServiceRoute(routePrefix,
            new WCFServiceHostFactory(),
            serviceType));

// WCFServiceHostFactory.cs

namespace MyServices.MyService
{
    public class WCFServiceHostFactory:WebServiceHostFactory
    {
        protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
        {
            WCFServiceHost host = new WCFServiceHost(serviceType, baseAddresses);

            return host;
        }
    }
}

// WCFServiceHost.cs

namespace MyServices.MyService
{
    public class WCFServiceHost:WebServiceHost
    {
        public WCFServiceHost(): base ()
        {
        }

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

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



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

          foreach (Uri baseAddress in BaseAddresses) {
            bool found = false;
            foreach (ServiceEndpoint se in Description.Endpoints)
                if (se.Address.Uri == baseAddress)
                {
                    found = true;
                    ((WebHttpBinding)se.Binding).ReaderQuotas.MaxStringContentLength = Int32.MaxValue;//here you set it and also set it below
                }
            if (!found) {
              if (ImplementedContracts.Count > 1)
                throw new InvalidOperationException ("Service '"+ Description.ServiceType.Name + "' implements multiple ServiceContract types, and no endpoints are defined in the configuration file. WebServiceHost can set up default endpoints, but only if the service implements only a single ServiceContract. Either change the service to only implement a single ServiceContract, or else define endpoints for the service explicitly in the configuration file. When more than one contract is implemented, must add base address endpoint manually");
              var  enumerator = ImplementedContracts.Values.GetEnumerator ();
              enumerator.MoveNext ();
              Type contractType = enumerator.Current.ContractType;
              WebHttpBinding binding = new WebHttpBinding();
              binding.ReaderQuotas.MaxStringContentLength = Int32.MaxValue; //here also
          AddServiceEndpoint (contractType, binding, baseAddress);
            }

          }

          foreach (ServiceEndpoint se in Description.Endpoints)
            if (se.Behaviors.Find<WebHttpBehavior> () == null)
              se.Behaviors.Add (new WebHttpBehavior ());

          // disable help page.
          ServiceDebugBehavior serviceDebugBehavior = Description.Behaviors.Find<ServiceDebugBehavior> ();
          if (serviceDebugBehavior != null) {
            serviceDebugBehavior.HttpHelpPageEnabled = false;
            serviceDebugBehavior.HttpsHelpPageEnabled = false;
          }
        }
    }
}
...