Ответ 1
Чтобы ответить на ваш запрос в вашем последнем комментарии к моему предыдущему ответу, я попытался придумать свой подход к тому, как я буду создавать (и изменять) конфигурацию сервера и клиента для любой данной службы. Это основано на обеих теориях, которые я читал (книги, блоги), в том, что я узнал в Juval Lowy WCF Master Class
, и довольно много практического опыта с несколькими крупными проектами внедрения услуг - это невозможно в одном месте, в Интернете или в книге.... так вот он идет:
Я бы начал с нуля. Сначала подумайте о своем сервисе:
- на каком адресе живет ваш сервис?
- какие привязки вы хотите поддержать?
Самый простой сценарий: одиночная служба, одиночная конечная точка, basicHttpBinding, все значения по умолчанию
Конфигурация службы:
<system.serviceModel>
<services>
<service name="YourNamespace.YourServiceClass">
<endpoint name="Default"
address="http://YourServer/SomeVirtualDirectory/YourService.svc"
binding="basicHttpBinding"
contract="YourNamespace.IYourServiceContract" />
</service>
</services>
</system.serviceModel>
Соответствующая конфигурация клиента:
<system.serviceModel>
<client name="Default">
<endpoint name="Default"
address="http://YourServer/SomeVirtualDirectory/YourService.svc"
binding="basicHttpBinding"
contract="YourClientProxyNamespace.IYourServiceContract" />
</client>
</system.serviceModel>
Тогда только когда-нибудь измените что-то, если вы действительно должны! И больше всего: НИКОГДА НИКОГДА не позволяйте Visual Studio (Добавить ссылку на службу) или svcutil.exe
испортить вашу конфигурацию! Защитите его, как яблоко вашего глаза!
Затем: если, например, ваша передача данных занимает больше времени, чем позволяет таймаут по умолчанию, равный 1 минутам, и измените эту единую настройку как на стороне обслуживания, так и на стороне клиента. Сделайте это, указав настраиваемую конфигурацию привязки и указав ее на конечные точки - , но измените только это - не больше! Оставьте все остальное как есть, со значениями по умолчанию. Никогда не изменяйте ничего, если вы не должны (и знать, что делаете, и почему вы это делаете).
Имейте в виду: sendTimeout
на клиенте (время, разрешенное до отправки всего сообщения) будет соответствовать receiveTimeout
на сервере - время, в течение которого будет отправлено целое сообщение (см. это отличный пост в блоге и этот форум форума MSDN для получения дополнительной информации)
Конфигурация службы:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="ExtendedTimeout"
receiveTimeout="00:05:00" />
</basicHttpBinding>
</bindings>
<services>
<service name="YourNamespace.YourServiceClass">
<endpoint name="Default"
address="http://YourServer/SomeVirtualDirectory/YourService.svc"
binding="basicHttpBinding"
bindingConfiguration="ExtendedTimeout"
contract="YourNamespace.IYourServiceContract" />
</service>
</services>
</system.serviceModel>
Соответствующая конфигурация клиента:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="ExtendedTimeout"
sendTimeout="00:05:00" />
</basicHttpBinding>
</bindings>
<client name="Default">
<endpoint name="Default"
address="http://YourServer/SomeVirtualDirectory/YourService.svc"
binding="basicHttpBinding"
bindingConfiguration="ExtendedTimeout"
contract="YourClientProxyNamespace.IYourServiceContract" />
</client>
</system.serviceModel>
Поскольку вам нужны другие изменения, например несколько конечных точек на стороне службы, или локальные параметры, такие как bypassProxyOnLocal
- адаптируйте свой конфиг, делайте это осторожно, шаг за шагом, вручную и считайте свою конфигурацию чрезвычайно важной частью всего вашего сервис - позаботьтесь о нем, поместите его в управление версиями и т.д.