###前提・実現したいこと
WCFサービスを、Windowsサービスにホストさせて、クライアントとTCP通信したいと思い、下記の記事を参考に実装進めております。
How to: Host WCF in a Windows Service Using TCP
例外を発生することなく、正常にTCPでクラサバ通信を行いたいと考えています。
###発生している問題・エラーメッセージ
サービスクライアントインスタンスをオープンするときに、例外が発生してしまいます。
なお、リモート先のマシンはファイヤーウォールを有効にしていて、該当のポート50000番(50000という数字は一例です)について例外設定(送受信ともに許可)しています。
そして、ポイントはファイヤーウォールを無効にすると例外が発生せず、正常にやり取りができていることです。
Service1Client client = null; string address = "net.tcp://<RemoteMachineName>:50000/MyService"; client = new Service1Client ("netTcpMyEndpoint", address); client.Open(); // <-- ここで例外 'System.Net.Sockets.SocketException'発生 // MyServiceClientはSystem.ServiceModel.ClientBase<TestProject.MyServiceReference.IService1>を継承し、 // TestProject.DebugWcfServiceReference.IService1を実装しているクラスです。 // これは Visual Studioにてサービス参照追加をした際に、自動で生成されるクラスです。
下記の例外が発生します。
<メッセージ> 'System.Net.Sockets.SocketException' 例外メッセージ : ”ホスト <RemoteMachineName> に対する DNS エントリが存在しません。” <トレース> 例外がスローされました: 'System.Net.Sockets.SocketException' (System.dll の中) 例外がスローされました: 'System.ServiceModel.EndpointNotFoundException' (System.ServiceModel.dll の中) 例外がスローされました: 'System.Reflection.TargetInvocationException' (mscorlib.dll の中) 例外がスローされました: 'System.ServiceModel.EndpointNotFoundException' (mscorlib.dll の中)
###Windowsサービスクラス
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceModel; using System.ServiceProcess; using System.Text; using System.Threading.Tasks; using WcfServiceLibrary1; namespace WindowsService1 { public partial class Service : ServiceBase { internal static ServiceHost myServiceHost = null; public Service() { InitializeComponent(); } protected override void OnStart(string[] args) { try { if (myServiceHost != null) { myServiceHost.Close(); } myServiceHost = new ServiceHost(typeof(Service1)); myServiceHost.Open(); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); throw; } } protected override void OnStop() { try { if (myServiceHost != null) { myServiceHost.Close(); myServiceHost = null; } } catch (Exception ex) { Console.WriteLine(ex.Message); throw; } } } }
###ホスト側のApp.Config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> </startup> <appSettings> <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> </appSettings> <system.web> <compilation debug="true" /> </system.web> <!-- サービス ライブラリ プロジェクトの展開時に、構成ファイルの内容をホストの app.config ファイルに追加する 必要があります。System.Configuration は、ライブラリの構成ファイルをサポートしていません。 --> <system.serviceModel> <bindings> <netTcpBinding> <binding name="netTcpServerBinding" portSharingEnabled="true"> <security mode="None"/> </binding> </netTcpBinding> </bindings> <services> <service name="WcfServiceLibrary1.Service1"> <endpoint address="" binding="netTcpBinding" bindingConfiguration="netTcpServerBinding" name="netTcpMyEndpoint" contract="WcfServiceLibrary1.IService1"> <identity> <dns value="localhost" /> </identity> </endpoint> <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" contract="IMetadataExchange" /> <host> <baseAddresses> <add baseAddress="net.tcp://localhost:50000/Service1" /> </baseAddresses> </host> </service> </services> <behaviors> <serviceBehaviors> <behavior> <!-- メタデータ情報の開示を避けるには、 展開する前に下の値を false に設定します --> <serviceMetadata httpGetEnabled="False" httpsGetEnabled="False"/> <!-- デバッグ目的で障害発生時の例外の詳細を受け取るには、 下の値を true に設定します。例外情報の開示を避けるには、 展開する前に false に設定します --> <serviceDebug includeExceptionDetailInFaults="False" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
###実試したこと
・上記の参考サイトのコードにおけるService1というクラス名が、WCFサービスとWindowsサービスで重複していたので、WindowsサービスのほうをServiceに名前変更しております。
・ファイヤーウォールの例外設定の変更
→ TCP 0-60000 を送受信許可、UDP 53を送受信許可
→ UDP 0-60000 を送受信許可 ← 「サービスクライアントインスタンスをオープンするときに、例外が発生」という問題は解決されました
###補足情報(言語/FW/ツール等のバージョンなど)
C# 6.0
Visual Studio 2015
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/23 05:43 編集
2017/02/23 06:33 編集
2017/02/23 07:05
2017/02/23 07:32
2017/02/23 07:58