Кто-нибудь получил IIS надежно работает как клиент WCF - PullRequest
0 голосов
/ 10 ноября 2009

Я пытаюсь заставить IIS6 надежно работать со службой WCF, которую я разместил в отдельном приложении Windows Service на той же машине. Пользователи подключаются к IIS через некоторые службы HTTP, что работает нормально, а затем IIS необходимо получить некоторую информацию из службы Windows, чтобы вставить HTTP-ответ. Мне также нужен канал обратного вызова между службой Windows и IIS.

После долгих усилий я начал работать с netTcpBinding, и все было бы роза в течение 5 или 10 минут, но после этого IIS сообщал бы о сбое в канале WCF, а затем отключал и останавливал обработку любых запросов до рабочего процесса. был переработан, и все повторилось.

Я пытался переключиться на netNamedPipeBinding, но IIS отказывается или ему отказано в доступе к каналу с ошибкой «Не было прослушивания конечной точки по net.pipe: // localhost / mypipename». Я могу подключиться к трубе нормально из консольного приложения.

Итак, у меня вопрос: кто-нибудь из этих двух связываний работал с IIS в качестве клиента, или есть другие подходы?

Ответы [ 3 ]

2 голосов
/ 10 ноября 2009

Мы используем IIS 7 и размещаем около 20 сервисов с привязками net.tcp и net.pipe, и все работает нормально.

Ваша проблема с трубкой мне кажется неверной конфигурацией. Если это помогает, вот как мы их настроили:

Сервер:

 <endpoint address ="" binding="fooBinding" 
           contract="Bla.IBlaAPI" 
           bindingConfiguration="BlaAPI.BindingConfig">

Конфигурация привязки:

<binding name="BlaAPI.BindingConfig"
                 receiveTimeout = "10:50:00"
                 sendTimeout = "10:50:00"
                 maxReceivedMessageSize="2147483647"
                 maxBufferSize="2147483647"
                 maxBufferPoolSize="2147483647"
                 transactionFlow="false">
          <readerQuotas maxDepth="32"
                       maxStringContentLength="2147483647"
                       maxArrayLength="2147483647"
                       maxBytesPerRead="8192"
                       maxNameTableCharCount="2147483647" />
          <security mode="None"/>
</binding>

Обратите внимание, что мы используем длинные тайм-ауты и имеем действительно высокие квоты для размера сообщений и т. Д., Потому что через этот сервис мы пропускаем большие объемы данных. Вы можете настроить для своих нужд. У нас установлено значение безопасности «none», потому что служба связывается только с защищенной локальной машины. Опять же, ваш пробег может отличаться.

Клиент:

<endpoint name="Bla.Bindings.BlaAPI" address="net.pipe://localhost/bla/IBlaAPI.svc"
                behaviorConfiguration="BlaAPI.ServiceBehavior"
                binding="netNamedPipeBinding" bindingConfiguration="BlaAPI.BindingConfig"
                contract="Bla.IBlaAPI" />

Что касается проблемы «Состояние ошибки», обратите внимание, что если во время выполнения служебного кода возникает необработанное исключение, экземпляр службы будет оставаться в состоянии «Ошибка», пока он не закроется должным образом. Чтобы избежать этого, либо обрабатывайте исключения на верхнем уровне службы, либо используйте, например, блоки обработки исключений в Enterprise Library.

1 голос
/ 15 ноября 2010

Re NetNamedPipeBinding и «Не было прослушивания конечной точки по net.pipe: // localhost / mypipename»

Является ли ваше веб-приложение подражает своим пользователям? Вышеуказанная ошибка возникает при попытке доступа к службе WCF через привязку именованного канала в контексте безопасности, маркер входа в который имеет членство NETWORK USERS. Стек каналов на стороне клиента WCF не различает ошибки «отказ в доступе» и ошибки «не найден», когда он пытается прочитать объект общей памяти, созданный службой, для публикации имени используемого канала. (См. http://blogs.charteris.com/blogs/chrisdi/archive/2008/05.aspx и т. Д.)

Жетоны олицетворения в приложении IIS всегда будут иметь членство NETWORK USERS.

0 голосов
/ 10 ноября 2009

Можете ли вы показать мне код, который вы используете для утилизации прокси-клиента wcf?

Никогда не используйте 'using' на прокси-сервере wcf, так как он не будет каждый раз корректно утилизироваться. Это может привести к ошибочному состоянию.

...