WCFはWindowsサービスからタイムアウトしますが、Webアプリケーションからはタイムアウトしません

StackOverflow https://stackoverflow.com/questions/807060

質問

こんにちはすべて

現在、WindowsサービスからWCFサービスを呼び出す際に問題が発生しています。私のアプリケーションソリューションは次のようになります。

  • Web管理コンソール(Webプロジェクト)
  • 中央制御(Windowsサービス)
    • WCFサービス。これにより、Web管理コンソールはそれに接続して構成できます
    • ノード上でWCFを使用するためのいくつかの呼び出し(ウィンドウサービス)
  • Node(Windowsサービス)
    • WCFサービスは、Central Control Windowsサービスが構成できるようにします

Web管理コンソールは中央制御WCFにアクセスできますが、中央制御はノードに接続しようとするとタイムアウトします。このテストでは、各サービスのインスタンスを作成するシンプルなWindowsフォームプロジェクトであるランチャーアプリを作成しました。このランチャーアプリは、各WindowsサービスでWCF機能を使用するボタンがいくつかあります(失敗したものを確認するため)どちらのWindowsサービスとも話せませんでした。これは私を混乱させたので、Web管理コンソールのWebフォームに同じボタンを追加し、WCFを介して両方のWindowsサービスに完全に接続しました。 IEを介してWCFが動作し、すべてのすばらしいXMLを見ることができるので、WCFが機能していることを知っています(そして、明らかにWebアプリからの呼び出しが機能するという事実は、それが稼働していることの良い兆候です)

要するに WebアプリはWindowsサービスでWCFサービスを使用できますが、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サービスを適切に作成し、インストーラーを追加しようとする前にすべて機能していました。インストーラーは正常に動作し、開始するサービスをインストールし、IEですべてのWCF XMLを表示できるようにします。

おわかりのように、私はWCFを初めて使用しますが、これはこれを使用する最初のアプリケーションです。基本的な部分は、設定ファイルを使用しないサンプルからのコピー/貼り付け/変更ジョブでした。

ご協力いただければ幸いです。

役に立ちましたか?

解決

appconfig内のすべてのエンドポイントが管理webappの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>

役立つことを願っています。幸運を祈ります。

他のヒント

これを適切に解決できませんでした。 WindowsサービスからWindowsサービスへの通信に問題があるようです。どこかでそれを実現する方法がありますが、私は時間を使い果たしたので、ビットの1つ(中央制御)を通常のWindowsアプリケーションに変えてそれをインストールすることでそれを解決しました。正常に動作し、クライアントは満足しています:)

Windowsサービスが実行されているユーザーのアクセス許可を確認します-ユーザーは、十分なアクセス許可がない可能性のあるネットワークサービスにデフォルト設定することを好みます。正しい権限を持つ専用ユーザーとしてそれらを実行します。

Windowsファイアウォールを確認します。一部のWeb接続をブロックするのが大好きです。通常はオフにします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top