WCFはWindowsサービスからタイムアウトしますが、Webアプリケーションからはタイムアウトしません
-
03-07-2019 - |
質問
こんにちはすべて
現在、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接続をブロックするのが大好きです。通常はオフにします。