настройка WCF с тегом ‹services›

Я пытаюсь решить ошибку WCF, обнаруженную в моем предыдущем вопросе. В основном ошибка такая:

При чтении данных XML превышена квота на максимальную длину строкового содержимого (8192).

И кто-то предложил использовать тег services в моем файле web.config, чтобы решить мою проблему.

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

Сервер не предоставил осмысленного ответа; это может быть вызвано несоответствием контракта, преждевременным завершением сеанса или внутренней ошибкой сервера.

Вот мой файл web.config с добавленным тегом services:

<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding
      name="BasicHttpBinding_Service1"
      closeTimeout="00:01:00"
      openTimeout="00:01:00"
      receiveTimeout="00:10:00"
      sendTimeout="00:01:00"
      allowCookies="false"
      bypassProxyOnLocal="false"
      hostNameComparisonMode="StrongWildcard"
      maxBufferSize="65536"
      maxBufferPoolSize="524288"
      maxReceivedMessageSize="65536"
      messageEncoding="Text"
      textEncoding="utf-8"
      transferMode="Buffered"
      useDefaultWebProxy="true">
      <readerQuotas
        maxDepth="32"
        maxStringContentLength="10000"
        maxArrayLength="16384"
        maxBytesPerRead="4096"
        maxNameTableCharCount="16384" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None"
          realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<client>
  <endpoint
    address="http://localhost:53931/WCF/Service1.svc"
    binding="basicHttpBinding"
    bindingConfiguration="BasicHttpBinding_Service1"
    contract="ServiceReference.Service1"
    name="BasicHttpBinding_Service1" />
</client>
<behaviors>
  <serviceBehaviors>
    <behavior name="">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<!--PROBLEM SOMEWHERE IN THE SERVICES TAG-->
<services>
  <service
    behaviorConfiguration="NewBehavior"
    name="AspPersonalWebsite.ServiceReference">
    <endpoint
      address="http://localhost:53931/WCF/Service1.svc"
      binding="basicHttpBinding"
      contract="ServiceReference.Service1"
      bindingConfiguration="BasicHttpBinding_Service1" />
  </service>
</services>

Обратите внимание, что после удаления тега services все работает нормально, но тогда я не смогу решить свою первоначальную проблему, опубликованную на моем предыдущий вопрос.

так может кто-нибудь, пожалуйста, скажите мне, если я делаю что-то неправильно в моем web.config, особенно в моем теге services?!


person Eyad    schedule 19.01.2011    source источник
comment
Что ж, вопрос действительно в следующем: ЯВЛЯЕТСЯ ЛИ действительно ли эта служба, которую вы настраиваете здесь?? Я имею в виду серверную часть службы, место, где живет и выполняется код службы??   -  person marc_s    schedule 19.01.2011


Ответы (3)


Ладно, займемся этим:

Во-первых, вам необходимо определить пользовательскую конфигурацию привязки basicHttpBinding с некоторыми пользовательскими настройками:

<bindings>
  <basicHttpBinding>
    <binding name="LargeSettings"
             maxBufferSize="524288"
             maxBufferPoolSize="524288"
             maxReceivedMessageSize="6553600">
        <readerQuotas maxDepth="32" maxStringContentLength="100000"
                      maxArrayLength="16384" maxBytesPerRead="4096"
                      maxNameTableCharCount="16384" />
      <security mode="None" />
    </binding>
  </basicHttpBinding>
</bindings>

Этот раздел должен присутствовать как в серверном файле web.config, так и в клиентской конфигурации.

Во-вторых, на серверной вам нужен тег <services>, определяющий вашу службу, ее конечные точки и их конфигурацию:

<services>
   <service name="YourNamespace.YourClassName"
            behaviorConfiguration="ServiceWithMetadata">
      <endpoint name="Default"
                address="http://localhost:53931/WCF/Service1.svc"
                binding="basicHttpBinding"
                bindingConfiguration="LargeSettings"
                contract="YourNamespace.IServiceContract" />
   </service>
</services>
<behaviors>
   <serviceBehaviors>
      <behavior name="ServiceWithMetadata">
         <serviceMetadata httpGetEnabled="true" />
         <serviceDebug includeExceptionDetailInFaults="false" />
      </behavior>
   </serviceBehaviors>
</behaviors>

Пункты для проверки:

  • ваше название службы должно быть полным именем (YourNamespace.YourClassName) вашего класса службы — класса, который реализует ваш сервисный контракт.
  • ваш контракт на обслуживание в конечной точке также должен быть полным именем вашего контракта на обслуживание (YourNamespace.IYourServiceContract)
  • поведениеКонфигурация вашего тега <service> должна ссылаться и точно соответствовать атрибуту name=, как определено в вашем разделе <behaviors>

И в-третьих, на стороне клиента вам нужно что-то вроде этого:

<client>
  <endpoint name="Default"
            address="http://localhost:53931/WCF/Service1.svc"
            binding="basicHttpBinding"
            bindingConfiguration="LargeSettings"
            contract="ServiceReference.IYourService" />
</client>

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

person marc_s    schedule 19.01.2011
comment
Вы ответили на мой пространный вопрос о служебном теге. однако я по-прежнему получаю сообщение: При чтении XML-данных превышена максимальная квота длины содержимого строки (8192). :) - person Eyad; 23.01.2011

Для тех, кто использует встроенную ссылку на сервис, просто используйте .Endpoint.Binding =THE NEW BINDING

ex:

BasicHttpBinding b = new BasicHttpBinding();
b.Security.Mode = BasicHttpSecurityMode.Transport;
...
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;               

MyWebServiceReference.ServiceReferenceSoapClient objRE = new MyWebServiceReference.ServiceReferenceSoapClient("ServiceReferenceSoap", "URI");
objRE.Endpoint.Binding = b;
person jonathan.lapierre    schedule 03.11.2011

Используйте этот параметр для ваших привязок,

 <basicHttpBinding>
        <binding maxReceivedMessageSize="2147483647"  messageEncoding="Text" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" >
          <readerQuotas  maxStringContentLength="525288"></readerQuotas>
        </binding>
      </basicHttpBinding>
person Telan Niranga    schedule 06.11.2013
comment
Вы подвергаете свою службу DOS-атакам, используя эти привязки в интернет-сценарии. - person Marc Selis; 06.08.2014
comment
В основном вы говорите, что вы разрешаете входящие запросы размером до 2 ГБ! Представьте, что будет, если хакер отправит вашему сервису 10 запросов по 2 ГБ. WCF попытается выделить 2 ГБ буфера в памяти для хранения каждого из этих запросов и, вероятно, потерпит неудачу. После ряда сбоев, ваш AppPool, вероятно, будет прекращен, и ваш сервис больше не будет доступен... - person Marc Selis; 06.08.2014