C# 如何检查网络TCP wcf服务是否已连接
用于检查net TCP wcf Windows服务是否正在运行的命令C# 如何检查网络TCP wcf服务是否已连接,c#,wcf,C#,Wcf,用于检查net TCP wcf Windows服务是否正在运行的命令 我尝试使用wcf的代理,调用合约时出现超时异常。因此无法确认服务是否正在运行以下方法可以实现您想要的效果。 1.使用Netstat windows命令检查端口是否正在通过TCP进行侦听。 例如,检查端口1900是否正在通过TCP进行侦听。 2.使用UDP发现终结点进行联机通知/脱机通知。 当服务器联机时,它可以使用UDP发现端点发送联机公告。 我举了个例子,希望对你有用。 服务器。 class Program {
我尝试使用wcf的代理,调用合约时出现超时异常。因此无法确认服务是否正在运行以下方法可以实现您想要的效果。
1.使用Netstat windows命令检查端口是否正在通过TCP进行侦听。
例如,检查端口1900是否正在通过TCP进行侦听。
2.使用UDP发现终结点进行联机通知/脱机通知。 当服务器联机时,它可以使用UDP发现端点发送联机公告。 我举了个例子,希望对你有用。
服务器。
class Program
{
static void Main(string[] args)
{
Uri uri = new Uri("net.tcp://localhost:1900");
NetTcpBinding binding = new NetTcpBinding();
using (ServiceHost sh=new ServiceHost(typeof(MyService),uri))
{
sh.AddServiceEndpoint(typeof(IService), binding, "");
ServiceMetadataBehavior smb;
smb = sh.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (smb == null)
{
smb = new ServiceMetadataBehavior()
{
};
sh.Description.Behaviors.Add(smb);
}
ServiceDiscoveryBehavior sdb = new ServiceDiscoveryBehavior();
sdb.AnnouncementEndpoints.Add(new UdpAnnouncementEndpoint());
sh.Description.Behaviors.Add(sdb);
sh.AddServiceEndpoint(new UdpDiscoveryEndpoint());
Binding binding1 = MetadataExchangeBindings.CreateMexTcpBinding();
sh.AddServiceEndpoint(typeof(IMetadataExchange), binding1, "mex");
sh.Open();
Console.WriteLine("Service is ready...");
Console.ReadLine();
sh.Close();
}
}
}
[ServiceContract(Namespace ="mydomain")]
public interface IService
{
[OperationContract(Name ="AddInt")]
int Add(int x, int y);
}
public class MyService : IService
{
public int Add(int x, int y)
{
return x + y;
}
}
static void Main(string[] args)
{
Console.Title = "Start client first";
AnnouncementService annsvc = new AnnouncementService();
annsvc.OnlineAnnouncementReceived += OnlineRec;
annsvc.OfflineAnnouncementReceived += OfflineRec;
using (ServiceHost host = new ServiceHost(annsvc))
{
host.AddServiceEndpoint(new UdpAnnouncementEndpoint());
host.Open();
Console.Read();
}
}
private static void OfflineRec(object sender, AnnouncementEventArgs e)
{
Console.WriteLine($"\nService is offline, service address:{e.EndpointDiscoveryMetadata.Address.Uri}");
}
private static void OnlineRec(object sender, AnnouncementEventArgs e)
{
Console.WriteLine($"\nService is online, service address:{e.EndpointDiscoveryMetadata.Address.Uri}");
}
结果。正式文件。
实际上,我们可以通过服务元数据地址获取服务状态。对于上面的例子,我们可以通过输入网络来检测服务状态。tcp://localhost:1900/mex 在添加服务参考对话框中。
3.使用记事本记录状态。请参考我的例子
Uri uri = new Uri("http://localhost:1000");
BasicHttpBinding binding = new BasicHttpBinding();
ServiceHost sh = null;
protected override void OnStart(string[] args)
{
sh = new ServiceHost(typeof(MyService), uri);
ServiceMetadataBehavior smb;
smb = sh.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (smb==null)
{
smb = new ServiceMetadataBehavior
{
HttpGetEnabled = true
};
sh.Description.Behaviors.Add(smb);
}
sh.Open();
WriteLog($"Service is ready at {DateTime.Now.ToString("hh-mm-ss")}");
}
protected override void OnStop()
{
if (sh!=null&&sh.State==CommunicationState.Opened)
{
sh.Close();
WriteLog($"Service is closed at {DateTime.Now.ToString("hh-mm-ss")}");
}
}
public static void WriteLog(string text)
{
using (StreamWriter sw=File.AppendText(@"D:\log.txt"))
{
sw.WriteLine(text);
sw.Flush();
}
}
Uri=新的Uri(“http://localhost:1000");
BasicHttpBinding=新的BasicHttpBinding();
ServiceHost sh=null;
启动时受保护的覆盖无效(字符串[]args)
{
sh=新服务主机(typeof(MyService),uri);
ServiceMetadataBehavior smb;
smb=sh.Description.Behaviors.Find();
如果(smb==null)
{
smb=新的ServiceMetadataBehavior
{
HttpGetEnabled=true
};
sh.Description.Behaviors.Add(smb);
}
sh.Open();
WriteLog($”服务在{DateTime.Now.ToString(“hh-mm-ss”)}准备就绪;
}
受保护的覆盖void OnStop()
{
if(sh!=null&&sh.State==CommunicationState.Opened)
{
sh.Close();
WriteLog($”服务在{DateTime.Now.ToString(“hh-mm-ss”)}关闭;
}
}
公共静态void WriteLog(字符串文本)
{
使用(StreamWriter sw=File.AppendText(@“D:\log.txt”))
{
sw.WriteLine(文本);
sw.Flush();
}
}
如果有什么我可以帮忙的,请随时告诉我。公告功能会很有帮助,请通过引用此链接来解决问题-当我有回拨服务合同时,我会遇到例外情况