Handle redirect manually
Your code looks solid, however here are a few minor points.

Catching/throwing exceptions

You should only catch exceptions when you are going to handle them. There's no point in catching an exception when you're only going to (re)throw it. However if you were to use logging and still 'bubble up' the exception, you could go with this:

try
{
    //Your webrequest/response code...
}
catch (Exception ex)
{
    //DO YOUR LOGGING HERE

    throw;
}


But as of now I would remove the try/catch from the method and handle exceptions outside of it:

try
{
    string theHtml = NetworkHelper.GetHtml("http://example.com");
}
catch (WebException ex)
{
   //Handle the exception
}




Stored url and data

As of now, your code doesn't allow the same url twice in a row; it'll just return the stored data. This raises 2 questions/issues with me:


What if I want to refresh the result?
I can bypass the check easily but in a hacky way:


Pass url1
Pass url2 to change the _storedUrl variable
Call the method again with url1



I think better would be to change the signature of the method and add a boolean (optional) parameter to indicate if you want to refresh the result:

public static string GetHtml(Uri url, bool refresh = false)
{
    if (url == _storedUrl &amp;&amp; !refresh)
        return _storedData;
    else
        _storedUrl = url;

    //Rest of the logic...
 }


Now you will only return the _storedData if you have the same url and don't want to refresh.

Hope this helps!