C#如果语句不起作用

C#如果语句不起作用,c#,C#,我的代码在本地网络中工作,我知道它不会在本地网络之外工作,因为我正在使用Dns.GetHostEntry将IP地址解析为主机名,这很好 但我的if语句不起作用,在尝试从不同的子网解析主机名时,我收到错误消息“找不到主机” 我想我的if语句会停止这个错误,但它不起作用,有人能帮忙吗,或者告诉我如何修复它,下面的代码 public partial class _Default : System.Web.UI.Page { //public string IPaddr1 { get; priv

我的代码在本地网络中工作,我知道它不会在本地网络之外工作,因为我正在使用Dns.GetHostEntry将IP地址解析为主机名,这很好

但我的if语句不起作用,在尝试从不同的子网解析主机名时,我收到错误消息“找不到主机”

我想我的if语句会停止这个错误,但它不起作用,有人能帮忙吗,或者告诉我如何修复它,下面的代码

public partial class _Default : System.Web.UI.Page
{
    //public string IPaddr1 { get; private set; }

    string serviceDesk = "eg@mail.co.uk";
    string emailSubject = "MyPc";
    string IPaddr = "";
    string deviceName = "";


    protected void Page_Load(object sender, EventArgs e)
    {
        getIP();
    }

    protected void getIP()
    {
        if (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDER_FOR"] != null)
        {
            IPaddr = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDER_FOR"].ToString();
        }
        if (HttpContext.Current.Request.UserHostAddress.Length != 0)
        {
            IPaddr = HttpContext.Current.Request.UserHostAddress;
            deviceName = Dns.GetHostEntry(IPAddress.Parse(IPaddr)).HostName;

        }
        if (HttpContext.Current.Request.UserHostAddress.Length != 0)
        {


            deviceName = "Device name could be found";

        }


        Label1.Text = "IP Address: " + " " + IPaddr;
        Label2.Text = "PC Name: " + " " + deviceName;



    }


    private void EmailVerificationRequest(string recepientEmail, string subject)
    {
        try
        {
            using (MailMessage mailMessage = new MailMessage())
            {
                StringBuilder sbEmailBody = new StringBuilder();

                sbEmailBody.Append("IP address " + IPaddr + "<br/>");
                sbEmailBody.Append("Hostname " + " " + deviceName);

                mailMessage.From = new MailAddress(ConfigurationManager.AppSettings["FromEmail"]);
                mailMessage.Subject = subject;
                mailMessage.Body = sbEmailBody.ToString();
                mailMessage.IsBodyHtml = true;
                mailMessage.To.Add(new MailAddress(recepientEmail));

                SmtpClient smtp = new SmtpClient();

                smtp.Host = ConfigurationManager.AppSettings["Host"];
                smtp.Port = Convert.ToInt32(ConfigurationManager.AppSettings["Port"]);
                smtp.EnableSsl = Convert.ToBoolean(ConfigurationManager.AppSettings["EnableSsl"]);

                System.Net.NetworkCredential NetworkCred = new System.Net.NetworkCredential();
                NetworkCred.UserName = ConfigurationManager.AppSettings["UserName"];
                NetworkCred.Password = ConfigurationManager.AppSettings["Password"];

                if (string.IsNullOrWhiteSpace(NetworkCred.UserName))
                {
                    smtp.UseDefaultCredentials = true;
                }
                else
                {
                    smtp.Credentials = NetworkCred;
                    smtp.UseDefaultCredentials = false;
                }

                smtp.Port = int.Parse(ConfigurationManager.AppSettings["Port"]);

                try
                {
                    smtp.Send(mailMessage);
                }

                catch (SmtpException e)
                {
                }
            }
        }

        catch
        {
        }
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        EmailVerificationRequest(serviceDesk, emailSubject);
        Response.Redirect("~/message.aspx");
    }









}
public分部类\u默认值:System.Web.UI.Page
{
//公共字符串IPaddr1{get;private set;}
字符串serviceDesk=”eg@mail.co.uk";
字符串emailSubject=“MyPc”;
字符串IPaddr=“”;
字符串deviceName=“”;
受保护的无效页面加载(对象发送方、事件参数e)
{
getIP();
}
受保护的void getIP()
{
if(HttpContext.Current.Request.ServerVariables[“HTTP\u X\u FORWARDER\u FOR”]!=null)
{
IPaddr=HttpContext.Current.Request.ServerVariables[“HTTP_X_FORWARDER_FOR”].ToString();
}
if(HttpContext.Current.Request.UserHostAddress.Length!=0)
{
IPaddr=HttpContext.Current.Request.UserHostAddress;
deviceName=Dns.GetHostEntry(IPAddress.Parse(IPAddress)).HostName;
}
if(HttpContext.Current.Request.UserHostAddress.Length!=0)
{
deviceName=“可找到设备名称”;
}
Label1.Text=“IP地址:”+“”+IPaddr;
Label2.Text=“PC名称:”+“”+deviceName;
}
private void EmailVerificationRequest(字符串recepientEmail,字符串主题)
{
尝试
{
使用(MailMessage=newmailmessage())
{
StringBuilder sbEmailBody=新的StringBuilder();
sbEmailBody.Append(“IP地址”+IPaddr+”
); 追加(“主机名”+“”+deviceName); mailMessage.From=新邮件地址(ConfigurationManager.AppSettings[“FromEmail”]); mailMessage.Subject=主题; mailMessage.Body=sbEmailBody.ToString(); mailMessage.IsBodyHtml=true; mailMessage.To.Add(新邮件地址(recepientEmail)); SmtpClient smtp=新SmtpClient(); smtp.Host=ConfigurationManager.AppSettings[“主机”]; smtp.Port=Convert.ToInt32(ConfigurationManager.AppSettings[“端口]); smtp.EnableSsl=Convert.ToBoolean(ConfigurationManager.AppSettings[“EnableSsl”]); System.Net.NetworkCredential NetworkCred=新系统.Net.NetworkCredential(); NetworkCred.UserName=ConfigurationManager.AppSettings[“UserName”]; NetworkCred.Password=ConfigurationManager.AppSettings[“Password”]; if(string.IsNullOrWhiteSpace(NetworkCred.UserName)) { smtp.UseDefaultCredentials=true; } 其他的 { smtp.Credentials=NetworkCred; smtp.UseDefaultCredentials=false; } smtp.Port=int.Parse(ConfigurationManager.AppSettings[“端口]); 尝试 { smtp.Send(mailMessage); } 捕获(SMTPE异常) { } } } 接住 { } } 受保护的无效按钮1\u单击(对象发送者,事件参数e) { EmailVerificationRequest(服务台、emailSubject); Response.Redirect(“~/message.aspx”); } }
从字典中获取值之前,必须检查字典是否包含您传递的密钥。您可以通过调用“Contains”方法来实现这一点

如果您直接检索词典的内容,并且您请求的密钥在词典对中不存在,则词典不会返回null。相反,它会从以下位置抛出KeyNotFoundException.

如果找不到主机名,则返回值为11001的SocketException异常(Windows套接字错误WSAHOST_not_found)。如果DNS服务器没有响应,则会返回此异常。如果名称不是正式主机名或别名,或者在查询的数据库中找不到,也可以返回此异常

因此,我怀疑您的代码没有达到第三个
if
条件,因为调用
GetHostEntry()
会引发异常,您将其视为“错误”找不到主机“消息”

处理此问题最直接的方法是使用
try…catch
块捕获特定异常并进行处理,例如:

try
{
    deviceName = Dns.GetHostEntry(IPAddress.Parse(IPaddr)).HostName;
}
catch (SocketException)
{
    deviceName = "Device name could be found";
}
这意味着,如果在调用
GetHostEntry()
期间发生
SocketException
,则代码将跳转到catch块,而不是停止应用程序的异常

请注意,这假设任何
SocketException
都意味着找不到IP地址,但这可能意味着DNS服务器无法联系,或者出现其他错误

在异常处理以及如何使用
try…catch
块方面有很多内容


希望这能有所帮助

您是否在调试器中单步执行了代码?您是否正试图从某个私有子网中获取
PTR
记录的IP地址?或者是不存在PTR的地方?或者换句话说,您是否确定所用名称服务器知道该信息。我怀疑它只是不…是的,DNS服务器不知道IP地址的记录,这导致了错误消息,这很好,但我想我的IF语句说,如果我们无法将IP地址解析为消息的主机名,则无法找到设备…您的IF语句非常精确,也许回报值不是你想象的那样?检查函数签名
try
{
    deviceName = Dns.GetHostEntry(IPAddress.Parse(IPaddr)).HostName;
}
catch (SocketException)
{
    deviceName = "Device name could be found";
}