#wcf #wcf-binding #wcf-client
#wcf #привязка wcf #wcf-client
Вопрос:
Я определил MaxBufferSize = 2147483647, MaxBufferPoolSize = 2147483647, maxReceivedMessageSize = 2147483647 в файле конфигурации сервера, но когда я генерирую файл конфигурации клиента, значения для всех этих параметров там по умолчанию, и мне приходится редактировать их вручную. Вот как я генерирую файл конфигурации клиента
svcutil.exe /language:cs /out:generatedProxy.cs /config:app.config net.tcp:/
/localhost:4365/MyService
Также, поскольку я использую максимальные значения в MaxBufferSize, MaxBufferPoolSize, maxReceivedMessageSize и MaxItemsInObjectGraph, повлияет ли это на производительность?
—Значения конфигурации сервера—
<bindings>
<netTcpBinding>
<binding name="MySvc_InsecureTcp" closeTimeout="00:01:10" openTimeout="00:01:10" receiveTimeout="24.20:31:23.6470000"
listenBacklog="1000" maxConnections="1000" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
<security mode="None">
<transport protectionLevel="None" />
</security>
</binding>
<binding name="MySvc_mexBinding" closeTimeout="00:01:10" openTimeout="00:01:10" receiveTimeout="24.20:31:23.6470000"
listenBacklog="1000" maxConnections="1000" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
<security mode="None">
<transport protectionLevel="None" />
</security>
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="MyService">
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
<serviceDebug includeExceptionDetailInFaults="false" />
<serviceThrottling maxConcurrentCalls="30" maxConcurrentInstances="2147483647" maxConcurrentSessions="30" />
<serviceMetadata />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="MyNameSpace.MyService" behaviorConfiguration="MyService">
<endpoint address="" binding="netTcpBinding" contract="MyNameSpace.IMyService"
bindingConfiguration="MySvc_InsecureTcp" name="netTcpMySvc" >
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="netTcpBinding" contract="IMetadataExchange"
bindingConfiguration="MySvc_mexBinding" name="mexMySvc" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:4365/MyService"/>
</baseAddresses>
</host>
</service>
</services>
—После выполнения еще нескольких тестов—
MaxItemsInObjectGraph не включается в файл конфигурации клиента. И если клиент отправляет большие объекты, MaxItemsInObjectGraph следует изменить вручную.
<behaviors>
<endpointBehaviors>
<behavior name="FASTServiceBehaviour">
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</endpointBehaviors>
</behaviors>
Ответ №1:
Не каждое значение конфигурации, определенное в службе, передается клиенту через метаданные. Размеры буфера и квоты чтения являются одним из примеров, поскольку каждый участник обмена данными может устанавливать свои собственные значения — эти значения являются защитой от атаки типа «Отказ в обслуживании» и могут различаться между сервисом и клиентом на основе обмененных сообщений. Например, если вы хотите загружать только большие наборы данных, вы должны правильно установить их в службе, но вам не нужно изменять их на клиенте. Загрузка имеет обратный эффект.
Комментарии:
1. итак, если я ожидаю, что клиент отправит мне большие объекты, я должен изменить эти значения на стороне сервера, но не изменить на стороне клиента?
2. Если вы не хотите отправлять большие объекты обратно клиенту, вам не нужно это менять.
3. это односторонняя операция. клиент ничего не получает обратно.
4. В таком случае вы можете использовать значения по умолчанию на клиенте.
Ответ №2:
Это нормально. Эти свойства ограничены этим файлом конфигурации и не распространяются на всю службу. Клиенты и серверы могут иметь разные ограничения по размеру, в основном для защиты сервера от чрезмерно длинных запросов (которые может ожидать клиент).