![](/img/trans.png)
[英]ASP.NET UDP socket code works in development, but not in production on IIS
[英]IP and Ping Class .Net - Works in Development not in Production?
因此,我實施了Ping課堂的各種方法,其中包括我因Vinjay BR找到的最全面的方法 。 但是,我似乎無法獲得任何可用於生產的解決方案。 我可以在VS 2015中使用它,但這並不是說太多,因為我認為PING甚至都不會離開我的網絡(我絕對不是網絡專家,所以這是一個假設)。 我還必須在下面僅使用數組元素0來實現Split(“:”)方法,因為如果我不這樣做,則IPAddress類將在核心IPAddress的末尾捕獲帶有“:4321”的IP地址。 我已經嘗試使用完整的地址和截斷的地址,但是兩種方法都不起作用。 我使用了帶有截斷地址的cmd.exe Ping命令來檢查兩者,我只能用截斷的地址完成ping,因此我將Split()留在了游戲中。 我很茫然,希望有人看到一頭大象。 如果有幫助,我的生產服務器是Azure。
當前,它引發了PingException捕獲。
public class PingTest
{
public void Pinger()
{
SpeedTest Test = new SpeedTest();
IPAddress ip = new IPAddress();
var clientIP = ip.GetIPAddress();
string[] IPAddresses = clientIP.Split(':');
string address = IPAddresses[0];
//set the ping options, TTL 128
PingOptions pingOptions = new PingOptions(128, true);
//create a new ping instance
Ping ping = new Ping();
//32 byte buffer (create empty)
byte[] buffer = new byte[32];
//here we will ping the host 4 times (standard)
for (int i = 0; i < 4; i++)
{
try
{
//send the ping 4 times to the host and record the returned data.
//The Send() method expects 4 items:
//1) The IPAddress we are pinging
//2) The timeout value
//3) A buffer (our byte array)
//4) PingOptions
PingReply pingReply = ping.Send(address, 1000, buffer, pingOptions);
//make sure we dont have a null reply
if (!(pingReply == null))
{
switch (pingReply.Status)
{
case IPStatus.Success:
Test.Address = pingReply.Address.ToString();
Test.ResponseTime = pingReply.RoundtripTime.ToString() + " ms";
Test.Status = pingReply.Status.ToString();
Test.UserId = User.Identity.GetUserId();
Test.TestDate = DateTime.Now;
Test.TestType = "Ping";
break;
case IPStatus.TimedOut:
Test.Address = pingReply.Address.ToString();
Test.ResponseTime = "";
Test.Status = "Connection has timed out...";
Test.UserId = User.Identity.GetUserId();
Test.TestDate = DateTime.Now;
Test.TestType = "Ping";
break;
default:
Test.Address = pingReply.Address.ToString();
Test.ResponseTime = "";
Test.Status = pingReply.Status.ToString();
Test.UserId = User.Identity.GetUserId();
Test.TestDate = DateTime.Now;
Test.TestType = "Ping";
break;
}
}
else
{
Test.Address = pingReply.Address.ToString();
Test.ResponseTime = "";
Test.Status = "Connection failed for an unknown reason...";
Test.UserId = User.Identity.GetUserId();
Test.TestDate = DateTime.Now;
Test.TestType = "Ping";
}
}
catch (PingException ex)
{
Test.Address = address;
Test.ResponseTime = "";
Test.Status = string.Format("Connection Error: {0}", ex.Message);
Test.UserId = User.Identity.GetUserId();
Test.TestDate = DateTime.Now;
Test.TestType = "Ping";
}
catch (SocketException ex)
{
Test.Address = address;
Test.ResponseTime = "";
Test.Status = string.Format("Connection Error: {0}", ex.Message);
Test.UserId = User.Identity.GetUserId();
Test.TestDate = DateTime.Now;
Test.TestType = "Ping";
}
}
using (ApplicationDbContext db = new ApplicationDbContext())
{
db.SpeedTest.Add(Test);
db.SaveChanges();
}
}
}
獲取IP地址:
public class IPAddress
{
public string GetIPAddress()
{
//The X-Forwarded-For (XFF) HTTP header field is a de facto standard for identifying the originating IP address of a
//client connecting to a web server through an HTTP proxy or load balancer
String ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(ip))
{
ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
return ip;
}
}
IPAddress類捕獲尾端帶有“:4321”的IP地址
:4321部分是端口號。 不應在調用ping.Send()時提供它。
如果您查看MSDN 上Ping的文檔 ,則會發現該短語的用法很隨意。
嘗試發送Internet控制消息協議(ICMP)回顯消息
嘗試是有效的詞。 許多服務器配置為不響應ping請求,許多防火牆阻止此類請求。
您的代碼在本地工作。 如果服務器的IP地址正確,則代碼應該正確。 失敗的最可能原因是網絡基礎結構或服務器阻止了請求的完成。
要測試假設,請在客戶端計算機上打開命令提示符,然后輸入
ping 1.2.3.4
用實際的IP地址替換1.2.3.4。 如果沒有收到答復,則說明ping被阻止,您的代碼也將無法完成ping。
如果有幫助,我的生產服務器是Azure。
是的,它確實。
不允許通過Azure負載平衡器使用ICMP協議。
但是,一切並沒有丟失。 您可以使用諸如PsPing之類的工具來測試服務器上端口(例如HTTP端口80)的可用性。 請注意,本文討論了從 Azure服務器連接到 Internet的問題。 但是,這在任一方向上都有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.