Hi Everyone,
Thanks for all the info about the connection issues, I think I may have a solution.

Somewhat like hruska's changes, I've added a simple state machine to the WiServer to monitor the connection and restart things as needed. What's different is that it's all handled through the server_task function so your sketch loop stays nice and simple.
The first change is that the WiShield is no longer started by the WiServer.init() call, and it will promptly return (it's asynchronous) and allow the rest of your code to run. Instead, initializing the WiShield and establishing the connection is performed by the server_task function, and thus it can automatically do so again if needed in the event of a lost connection.
When a connection is lost, uip_abort is called and the uip stack is run so that any pending requests get cleaned up. This means that the 'active' flag on a POST or GET request should get reset correctly. The state machine is then reset to the initial disconnected state in order to restart the connection.
I did notice that the WiShield likes to establish a connection within a few seconds of being initialized. If a minute or so passes before the wireless network is active, it doesn't seem to connect. To address that behavior, the state machine waits up to 15 seconds for a connection after initializing the WiShield; if no connection is made, it re-initializes the WiShield and starts over.
Calls to server_task are still asynchronous, so it returns promptly even if WiServer is waiting for a connection. However, there are instances where you may want to wait for connection before doing other things. Therefore, server_task now returns a boolean value to let you know if there's a valid connection, and there's also a new function called checkConnection(int seconds) that allows you to query the connection and if necessary, wait for a certain period of time for a connection. You can call this function with 0 to just check the state and return, or you can use -1 to wait indefinitely until there's a connection.
This code is still
experimental and has debug printlns all over the place, but I'm posting it here in the hopes that a few brave soles will
try it out and let me know how well it works. Only WiServer.h and WiServer.cpp are affected. Once it's been proven to address the issues, I'll clean it up and post to the official source repo on Github.
Enjoy!
Mark