Время ожидания WCF из служб Windows, но не из веб-приложений - PullRequest
1 голос
/ 30 апреля 2009

Привет всем

У меня сейчас проблема с вызовом службы WCF из службы Windows. Мое решение для приложений выглядит следующим образом.

  • Консоль веб-администрирования (веб-проект)
  • Центральный контроль (служба Windows)
    • Служба WCF, чтобы консоль веб-администрирования могла подключиться к ней и настроить ее
    • Несколько вызовов для использования WCF на узле (служба Windows)
  • Узел (служба Windows)
    • Служба WCF, позволяющая службе Central Control Windows настроить ее

Консоль веб-администрирования может обращаться к WCF центрального управления, но время ожидания центрального управления истекает, когда она пытается подключиться к узлу. При тестировании я создал приложение Launcher, которое представляет собой простой проект Windows Form, который создает экземпляр каждой службы и имеет несколько кнопок, которые используют функцию WCF в каждой из служб Windows (просто чтобы увидеть, что не удалось), это приложение Launcher не может говорить ни с одной из служб 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 и попытался добавить к ним установщики. Инсталляторы работают нормально и устанавливают сервисы, которые запускаются и позволяют мне видеть все WCF XML в IE.

Как вы могли бы сказать, я новичок в WCF, и это мое первое приложение, использующее его. Фундаментальные биты были в значительной степени заданиями копирования / вставки / изменения из примера, в котором не используются файлы конфигурации.

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

0 голосов
/ 08 мая 2009

Я не мог разобраться с этим должным образом. Похоже, что проблема связана с подключением службы Windows к службе Windows. Есть способ сделать это где-то, но у меня не хватило времени, поэтому я решил это, превратив один из кусочков (центральный элемент управления) в обычное приложение Windows и установив его таким образом. Работает нормально и клиент доволен :) 1001 *

0 голосов
/ 30 октября 2009

Проверьте разрешения для пользователей, под которыми работают Службы Windows - им по умолчанию нравится Сетевая служба, которая может не иметь достаточных разрешений. Запустите их как выделенный пользователь с правильными разрешениями.

И проверьте брандмауэр Windows. Он любит блокировать некоторые из ваших веб-соединений. Я обычно просто выключаю его.

0 голосов
/ 30 апреля 2009

убедитесь, что все конечные точки в appconfig соответствуют настройкам в webconfig администратора веб-приложения. каждый из них устанавливает различные значения времени ожидания, например:

<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>

надеюсь, это поможет. удачи.

...