如果网址作为输入提供,是否有人可以指导我为了获取每个网址的页面加载时间而编写哪些C#代码?
OR
如果可能,请提供链接到任何软件。任何将多个URL作为输入并为每个URL提供页面加载时间的软件。
答案 0 :(得分:4)
您是想测量第一个请求被回答所需的时间,还是要包括下载样式和外部脚本以及客户端呈现?
首先可以使用WebClient来解决第一个问题。
WebClient client = new WebClient ();
// Add a user agent header in case the
// requested URI contains a query.
client.Headers.Add ("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Stream data = client.OpenRead (@"your-url-here");
StreamReader reader = new StreamReader (data);
string s = reader.ReadToEnd();
stopwatch.Stop();
Console.WriteLine("Time elapsed: {0}", stopwatch.Elapsed);
data.Close();
reader.Close();
对于后者,在表单上放置WebBrowser,您可以在其中创建使用DocumentCompleted事件的方法:
// in your form declarations
Stopwatch _stopwatch = new Stopwatch();
String _url = @"your-url-here";
// in the button-click or whenever you want to start the test
_stopwatch.Start();
this.WebBrowser1.Navigate(_url);
// The DocumentCompled event handler
private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (e.Url == _url)
{
_stopwatch.Stop();
Console.WriteLine("Time elapsed: {0}", _stopwatch.Elapsed);
}
}
答案 1 :(得分:3)
如果我正确理解了这个问题,那么Apache JMeter可以这样做:http://jmeter.apache.org/
它是可编写脚本的,您可以设置各种负载测试方案。
答案 2 :(得分:2)
试试这个
var URLs = new[]
{
"http://www.google.com",
"http://www.microsoft.com",
"http://www.slashdot.org"
};
var tasks = URLs.Select(
url => Task.Factory.StartNew(task =>
{
using (var client = new WebClient())
{
var t = (string)task;
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
String result = client.DownloadString(t);
stopwatch.Stop();
Console.WriteLine(String.Format("{0} = {1}", url, stopwatch.Elapsed));
}
}, url)
).ToArray();
Task.WaitAll(tasks);
有了这个,我得到了
http://www.microsoft.com = 00:00:05.1784172 milliseconds
http://www.slashdot.org = 00:00:09.9922422 milliseconds
http://www.google.com = 00:00:10.8720623 milliseconds
答案 3 :(得分:1)
我推荐使用YSlow,它是检查网站效果的非常有用的工具,YSlow
答案 4 :(得分:1)
我确信您熟悉Web调试代理Fiddler。 Fiddler中有很多你不需要(比如UI)你的应用程序,但它们提供了一个.NET库,可以包含在你的项目中,它将为你提供你可能想要的所有HTTP。
FiddlerCore目前作为.NET类库提供 任何.NET应用程序都可以使用它。 FiddlerCore专为 用于运行no的特殊用途应用程序 用户界面(例如测试自动化),或者如此专业化的UI Fiddler Addon不适合(例如WPF流量可视化)。
下载中包含一个示例应用程序,我在几分钟内修改了该应用程序,您可以访问统计信息选项卡下的fiddler UI中显示的相同信息。检查fiddlercore dll中的Session.Timers对象以获取这些值。
ClientConnected:15:03:05.017
ClientBeginRequest:15:03:05.056
ClientDoneRequest:15:03:05.076
确定网关:0ms
DNS查询:3ms
TCP / IP连接:20ms
HTTPS握手:0ms
ServerConnected:15:03:05.151
FiddlerBeginRequest:15:03:05.152
ServerGotRequest:15:03:05.157
ServerBeginResponse:15:03:05.292
ServerDoneResponse:15:03:05.314
ClientBeginResponse:15:03:05.331
ClientDoneResponse:15:03:05.333
总体时间:00:00:00.2770277
希望这会有所帮助,您需要弄清楚如何创建自己的会话而不是使用代理,但这是产品的声明功能,不需要太多时间。
答案 5 :(得分:0)
您需要Stopwatch
,以及WebClient
或WebRequest
。
答案 6 :(得分:0)
我使用它来保持内部网站活跃并测量/记录响应时间,这是一种保持活跃的服务:
static void Main(string[] args)
{
LoggingManager.ConfigureAtStartup();
ErrorLogger.LogInformation("STARTED");
try
{
if (args.Length < 1)
{
ErrorLogger.LogInformation("No parameters provided...");
return;
}
int pingTimeoutMilliseconds = Convert.ToInt32(ConfigurationManager.AppSettings["pingTimeoutMilliseconds"]);
var urls = args[0].Split(';');
foreach (string url in urls)
{
if (string.IsNullOrWhiteSpace(url))
{
continue;
}
ErrorLogger.LogInformation(String.Format("Pinging url: {0}", url));
using (var client = new WebClient())
{
client.Credentials = CredentialCache.DefaultCredentials;
var stopW = new Stopwatch();
stopW.Start();
string result = client.DownloadString(url);
var elapsed = stopW.ElapsedMilliseconds;
stopW.Stop();
if (elapsed > pingTimeoutMilliseconds)
{
ErrorLogger.LogWarning(String.Format("{0} - took: {1} milliseconds to answer!", url, elapsed.ToString("N0")));
ErrorLogger.LogInformation(String.Format("Response was: {0} chars long", result.Length.ToString("n0")));
}
}
}
}
catch(Exception exc)
{
ErrorLogger.LogError(exc);
}
finally
{
ErrorLogger.LogInformation("COMPLETED");
LoggingManager.ShutdownOnExit();
}
}
ErrorLogger
是我在Log4Net
附近做的一个小包装。