Вопрос

Всем привет

В настоящее время у меня возникла проблема с вызовом службы 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.Он любит блокировать некоторые ваши веб-соединения.Обычно я просто выключаю его.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top