gpt4 book ai didi

c# - 在 C# 中验证 URL 的一种比 try-catch 更好的方法?

转载 作者:IT王子 更新时间:2023-10-29 03:43:55 25 4
gpt4 key购买 nike

我正在构建一个应用程序以从 Internet 检索图像。尽管它工作正常,但在应用程序中使用 try-catch 语句时速度很慢(在错误的给定 URL 上)。

(1) 这是验证 URL 和处理错误输入的最佳方式吗?还是我应该改用 Regex(或其他一些方法)?

(2) 如果我没有在文本框中指定 http://,为什么应用程序会尝试在本地查找图像?

private void btnGetImage_Click(object sender, EventArgs e)
{
String url = tbxImageURL.Text;
byte[] imageData = new byte[1];

using (WebClient client = new WebClient())
{
try
{
imageData = client.DownloadData(url);
using (MemoryStream ms = new MemoryStream(imageData))
{
try
{
Image image = Image.FromStream(ms);
pbxUrlImage.Image = image;
}
catch (ArgumentException)
{
MessageBox.Show("Specified image URL had no match",
"Image Not Found", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
}
catch (ArgumentException)
{
MessageBox.Show("Image URL can not be an empty string",
"Empty Field", MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
catch (WebException)
{
MessageBox.Show("Image URL is invalid.\nStart with http:// " +
"and end with\na proper image extension", "Not a valid URL",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
} // end of outer using statement
} // end of btnGetImage_Click

编辑:我尝试了 Panagiotis Kanavos 建议的解决方案(感谢您的努力!),但如果用户输入 http:// 仅此而已,它只会被 if-else 语句捕获。更改为 UriKind.Absolute 也会捕获空字符串!越来越近 :)目前的代码:

private void btnGetImage_Click(object sender, EventArgs e)
{
String url = tbxImageURL.Text;
byte[] imageData = new byte[1];
Uri myUri;

// changed to UriKind.Absolute to catch empty string
if (Uri.TryCreate(url, UriKind.Absolute, out myUri))
{
using (WebClient client = new WebClient())
{
try
{
imageData = client.DownloadData(myUri);
using (MemoryStream ms = new MemoryStream(imageData))
{
imageData = client.DownloadData(myUri);
Image image = Image.FromStream(ms);
pbxUrlImage.Image = image;
}
}
catch (ArgumentException)
{
MessageBox.Show("Specified image URL had no match",
"Image Not Found", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
catch (WebException)
{
MessageBox.Show("Image URL is invalid.\nStart with http:// " +
"and end with\na proper image extension",
"Not a valid URL",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
else
{
MessageBox.Show("The Image Uri is invalid.\nStart with http:// " +
"and end with\na proper image extension", "Uri was not created",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}

我一定是做错了什么。 :(

最佳答案

使用Uri.TryCreate仅当您的 url 字符串是有效 URL 时才创建新的 Uri 对象。如果该字符串不是有效的 URL,则 TryCreate 返回 false。

string myString = "http://someUrl";
Uri myUri;
if (Uri.TryCreate(myString, UriKind.RelativeOrAbsolute, out myUri))
{
//use the uri here
}

更新

TryCreate 或 Uri 构造函数将愉快地接受可能看起来无效的字符串,例如“Host: www.stackoverflow.com”、“Host:%20www.stackoverflow.com”或“chrome:about”。事实上,这些是完全有效的 URI,它们指定了自定义方案而不是“http”。

Uri.Scheme 的文档property 提供了更多示例,例如“gopher:”(有人记得这个吗?)、“news”、“mailto”、“uuid”。

应用程序可以将自己注册为自定义协议(protocol)处理程序,如 MSDN 中所述或其他 SO 问题,例如 How do I register a custom URL protocol in Windows?

TryCreate 不提供将自身限制为特定方案的方法。代码需要检查 Uri.Scheme 属性以确保它包含可接受的值

更新 2

传递一个奇怪的字符串,如 "></script><script>alert(9)</script>将返回 true并构造一个相对的 Uri 对象。来电 Uri.IsWellFormedOriginalString虽然会返回 false。所以你可能需要调用IsWellFormedOriginalString如果您想确保相对 Uris 的格式正确。

另一方面,调用 TryCreateUriKind.Absolute在这种情况下将返回 false。

有趣的是,Uri.IsWellFormedUriString 在内部调用 TryCreate,然后返回 IsWellFormedOriginalString 的值如果创建了相对 Uri。

关于c# - 在 C# 中验证 URL 的一种比 try-catch 更好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3228984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com