As others have said, it boils down to the StringReader not being disposed, so I won't hit on that.
What's going on is that the static analysis tool is essentially a dumb tool. And I don't mean dumb as in don't use it, I mean dumb as in it is looking at a very limited criteria.
In this case it sees an object being instantiated whose class implements IDisposable. The tool is then simply looking to see if you make a corresponding dispose call before the object goes out of scope. This can be made by either explicitly saying object.Dispose(); or through the using(var x = ...) { } clause.
According to MS specs, classes should implement IDisposable in the event they deal with unmanaged resources (like file handles). Now, you might want to review this MSDN post which talks about which classes that implement IDisposable that you don't necessarily have to call dispose() on.
Which leaves us with two viable solutions. The first (and one that I and Darin recommend) is to always wrap an object that implements IDisposable in a using clause. It's just good practice. After all, it causes zero harm to have in place, whereas not having it could cause lots of memory leaks (depending on the class) and I'm not smart enough to remember which is which.
The other would be to configure your static analysis tool (if possible) to ignore such warnings. I really think this would be a Bad Idea (tm)