Тайм-аут WCF для служб Windows, но не для веб-приложений
-
03-07-2019 - |
Вопрос
Всем привет
В настоящее время у меня возникла проблема с вызовом службы WCF из службы Windows.Мое прикладное решение выглядит так.
- Консоль веб-администрирования (веб-проект)
- Централизованное управление (служба Windows)
- WCF, чтобы консоль веб-администрирования могла подключиться к нему и настроить его.
- Несколько вызовов для использования WCF на узле (служба Windows)
- Узел (служба Windows)
- Служба WCF, позволяющая службе центрального управления Windows настроить ее.
Консоль веб-администрирования может получить доступ к Central Control WCF, но время ожидания Central Control истекает каждый раз, когда она пытается подключиться к Node.При тестировании этого я создал приложение запуска, которое представляет собой простой проект формы Windows, который создает экземпляр каждой службы и имеет пару кнопок, которые используют функцию WCF в каждой из служб Windows (просто чтобы увидеть, что не удалось). не мог поговорить ни с одной из служб Windows.Это меня смутило, поэтому я добавил те же кнопки в веб-форму в консоли веб-администрирования, и она прекрасно подключалась к обеим службам Windows через WCF.Я знаю, что материал WCF работает, поскольку я могу подключиться к нему через IE и увидеть весь замечательный XML (и, очевидно, тот факт, что вызовы работают из веб-приложения, является хорошим показателем того, что оно работает).
Суммируя Мои веб-приложения могут использовать службы WCF в моих службах Windows, но Windows Forms и службы Windows — нет.Почему это!?
У меня уже почти не осталось времени на этот проект, поэтому быстрые ответы были бы просто потрясающими!
Детали технологии/кодаЯ не использую конфигурационные файлы в приложениях.Все создается с помощью кода, и я использую один и тот же код для выполнения вызовов WCF повсюду.Также я попытался везде отключить безопасность на случай, если это будет проблемой.Также я использую то же самое svcutil генерировать прокси-файлы повсюду, чтобы все было согласованным
Пример вызова узла
Dim Bind As New WSHttpBinding(SecurityMode.None, True)
Bind.CloseTimeout = New TimeSpan(0, 0, 10)
Bind.OpenTimeout = New TimeSpan(0, 0, 10)
Bind.SendTimeout = New TimeSpan(0, 0, 10)
Dim client As New BN.BNodeServiceClient(Bind, New EndpointAddress("http://localhost:27374/Node"))
client.sendMessage("Test Message")
client.Close()
Нода открывает свой WCF
BNodeHost = New ServiceHost(GetType(iBNodeService))
BNodeHost.AddServiceEndpoint(GetType(BNodeService), New WSHttpBinding(SecurityMode.None, True), New Uri("http://localhost:27374/Node"))
Dim metadataBehavior As ServiceModel.Description.ServiceMetadataBehavior
metadataBehavior = BNodeHost.Description.Behaviors.Find(Of _
ServiceModel.Description.ServiceMetadataBehavior)()
If metadataBehavior Is Nothing Then
metadataBehavior = New ServiceModel.Description.ServiceMetadataBehavior()
metadataBehavior.HttpGetEnabled = True
metadataBehavior.HttpGetUrl = New Uri("http://localhost:27374/Node")
BNodeHost.Description.Behaviors.Add(metadataBehavior)
Else
BNodeHost.Description.Behaviors.Add(metadataBehavior)
End If
BNodeHost.Open()
Все это работало до того, как я сделал разные части подходящими службами Windows и попытался добавить к ним установщики.Установщики работают нормально и устанавливают службы, которые запускаются и позволяют мне видеть весь XML WCF в IE.
Как вы, наверное, заметили, я новичок в WCF, и это мое первое приложение, использующее его.Фундаментальные моменты в основном представляли собой задания копирования/вставки/изменения из примера, в котором не используются файлы конфигурации.
Любая помощь будет принята с благодарностью.
Решение
убедитесь, что все конечные точки в файле appconfig соответствуют настройкам в файле конфигурации веб-приложения администратора.каждый из них устанавливает различные значения таймаута, т.е.:
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_ILookupService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
algorithmSuite="Default" establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="LargeEndpointBehavior">
<dataContractSerializer ignoreExtensionDataObject="true" maxItemsInObjectGraph="2147483647"/>
</behavior>
</endpointBehaviors>
</behaviors>
<client>
<endpoint address="http://localhost:59599/LookupService.svc"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ILookupService"
contract="FEEALookupServiceReference.ILookupService" name="WSHttpBinding_ILookupService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</client>
</system.serviceModel>
надеюсь, это поможет.удачи.
Другие советы
Я не мог разобраться с этим должным образом.Похоже, возникла проблема со связью между службами Windows.Где-то есть способ сделать это, но у меня не хватило времени, поэтому я решил проблему, превратив один из компонентов (Центральный элемент управления) в обычное приложение Windows и установив его таким образом.Все работает, клиент доволен :)
Проверьте разрешения для пользователей, под которыми работают службы Windows — им по умолчанию нравится использовать сетевую службу, у которой может не быть достаточных разрешений.Запускайте их как выделенный пользователь с правильными разрешениями.
И проверьте брандмауэр Windows.Он любит блокировать некоторые ваши веб-соединения.Обычно я просто выключаю его.