настройка WCF с тегом <services> - PullRequest
7 голосов
/ 19 января 2011

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

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

И кто-то предложил использовать тег 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 ?!

Ответы [ 3 ]

26 голосов
/ 19 января 2011

Хорошо, давайте займемся этим:

Сначала , вам нужно определить пользовательскую 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>

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

1 голос
/ 03 ноября 2011

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

например:

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;
0 голосов
/ 06 ноября 2013

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

 <basicHttpBinding>
        <binding maxReceivedMessageSize="2147483647"  messageEncoding="Text" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" >
          <readerQuotas  maxStringContentLength="525288"></readerQuotas>
        </binding>
      </basicHttpBinding>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...