Skip to content

Instantly share code, notes, and snippets.

@migueldeicaza
Last active Aug 29, 2015
Embed
What would you like to do?
Updated patch from pull request #377 from Rob Wilkens to fix #5926 - Untested
diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ReplyChannelBase.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ReplyChannelBase.cs
index 01d85a2..d73b086 100644
--- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ReplyChannelBase.cs
+++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ReplyChannelBase.cs
@@ -29,11 +29,13 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
+using System.Net.Sockets;
using System.Net.Security;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Security;
using System.Threading;
+using System.Xml;
namespace System.ServiceModel.Channels
{
@@ -124,12 +126,29 @@ namespace System.ServiceModel.Channels
}
try {
return TryReceiveRequest (tout, out ctx);
+ } catch (XmlException ex) {
+ Console.WriteLine ("Xml Exception (Dropped Connection?):" + ex.Message);
+ //on dropped connection,
+ //whatever you do don't crash
+ //the whole app. Ignore for now
+ } catch (SocketException ex) {
+ Console.WriteLine ("Socket Exception (Dropped Connection?):" + ex.Message);
+ //on dropped connection,
+ //whatever you do don't crash
+ //the whole app. Ignore for now
+ } catch (IOException ex) {
+ Console.WriteLine ("I/O Exception (Dropped Connection?):" + ex.Message);
+ //on dropped connection,
+ //whatever you do don't crash
+ //the whole app. Ignore for now
} finally {
lock (async_result_lock) {
CurrentAsyncResult = null;
CurrentAsyncThread = null;
}
}
+ ctx = null;
+ return false;
});
RequestContext dummy;
IAsyncResult result;
diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/BaseRequestProcessor.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/BaseRequestProcessor.cs
index fe05194..1fcb4e2 100644
--- a/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/BaseRequestProcessor.cs
+++ b/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/BaseRequestProcessor.cs
@@ -5,6 +5,9 @@ using System.ServiceModel.Channels;
using System.ServiceModel.Security;
using System.ServiceModel.Security.Tokens;
using System.Text;
+using System.IO;
+using System.Xml;
+using System.Net.Sockets;
namespace System.ServiceModel.Dispatcher
{
@@ -24,8 +27,34 @@ namespace System.ServiceModel.Dispatcher
using (new OperationContextScope (mrc.OperationContext)) {
try {
process_handlers_chain.ProcessRequestChain (mrc);
- }
- catch (Exception e) {
+ } catch (IOException e) {
+ // FIXME?: On dropped connection do not
+ // dump a stacktrace, but should be safe
+ // to dump a console message as in
+ // default exception handler and
+ // call error_handlers_chain
+ Console.WriteLine ("I/O Error (Dropped Connection?): " + e.Message);
+ mrc.ProcessingException = e;
+ error_handlers_chain.ProcessRequestChain (mrc);
+ } catch (SocketException e) {
+ // FIXME?: On dropped connection do not
+ // dump a stacktrace, but should be safe
+ // to dump a console message as in
+ // default exception handler and
+ // call error_handlers_chain
+ Console.WriteLine ("SocketExcpetion (Dropped Connection?): " + e.Message);
+ mrc.ProcessingException = e;
+ error_handlers_chain.ProcessRequestChain (mrc);
+ } catch (XmlException e) {
+ // FIXME?: On dropped connection do not
+ // dump a stacktrace, but should be safe
+ // to dump a console message as in
+ // default exception handler and
+ // call error_handlers_chain
+ Console.WriteLine ("XmlException (Dropped Connection?): " + e.Message);
+ mrc.ProcessingException = e;
+ error_handlers_chain.ProcessRequestChain (mrc);
+ } catch (Exception e) {
// FIXME: this is not really expected use of ChannelDispatcher.ErrorHandlers.
// They are now correctly used in process_handler_chain (namely OperationInvokerHandler).
// For this kind of "outsider" exceptions are actually left thrown
diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/ChannelDispatcher.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/ChannelDispatcher.cs
index 15731e6..ca5e2e3 100644
--- a/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/ChannelDispatcher.cs
+++ b/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/ChannelDispatcher.cs
@@ -35,6 +35,9 @@ using System.Threading;
using System.Transactions;
using System.ServiceModel;
using System.ServiceModel.Description;
+using System.Net.Sockets;
+using System.Xml;
+using System.IO;
namespace System.ServiceModel.Dispatcher
{
@@ -598,7 +601,10 @@ namespace System.ServiceModel.Dispatcher
if (ProcessErrorWithHandlers (reply, ex, out res))
return;
- rc.Reply (res);
+ if ((!(ex is SocketException)) &&
+ (!(ex is XmlException)) &&
+ (!(ex is IOException)))
+ rc.Reply (res);
reply.Close (owner.DefaultCloseTimeout); // close the channel
} finally {
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment