217 lines
10 KiB
C#
217 lines
10 KiB
C#
|
//------------------------------------------------------------
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//------------------------------------------------------------
|
||
|
|
||
|
namespace System.ServiceModel
|
||
|
{
|
||
|
using System.Text;
|
||
|
using System.Globalization;
|
||
|
using System.Runtime.Serialization;
|
||
|
using System.Runtime.InteropServices;
|
||
|
using System.Runtime.Versioning;
|
||
|
using System.ServiceModel.Channels;
|
||
|
|
||
|
[Serializable]
|
||
|
public class MsmqException : ExternalException
|
||
|
{
|
||
|
[NonSerialized]
|
||
|
bool? faultSender = null;
|
||
|
[NonSerialized]
|
||
|
bool? faultReceiver = null;
|
||
|
[NonSerialized]
|
||
|
Type outerExceptionType = null;
|
||
|
|
||
|
public MsmqException()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
public MsmqException(string message)
|
||
|
: base(message)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
public MsmqException(string message, int error)
|
||
|
: base(message, error)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
public MsmqException(string message, Exception inner)
|
||
|
: base(message, inner)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
protected MsmqException(SerializationInfo info, StreamingContext context)
|
||
|
: base(info, context)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
internal bool FaultSender
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
TuneBehavior();
|
||
|
return this.faultSender.Value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal bool FaultReceiver
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
TuneBehavior();
|
||
|
return this.faultReceiver.Value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void TuneBehavior()
|
||
|
{
|
||
|
if (this.faultSender.HasValue && this.faultReceiver.HasValue)
|
||
|
return;
|
||
|
|
||
|
switch (this.ErrorCode)
|
||
|
{
|
||
|
// configuration erors
|
||
|
case UnsafeNativeMethods.MQ_ERROR_ACCESS_DENIED:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = typeof(AddressAccessDeniedException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_NO_INTERNAL_USER_CERT:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = typeof(CommunicationException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_QUEUE_DELETED:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = typeof(EndpointNotFoundException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_QUEUE_NOT_FOUND:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = typeof(EndpointNotFoundException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_CERTIFICATE_NOT_PROVIDED:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = typeof(CommunicationException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_INVALID_CERTIFICATE:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = typeof(CommunicationException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_CANNOT_CREATE_CERT_STORE:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = typeof(CommunicationException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_CORRUPTED_PERSONAL_CERT_STORE:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = typeof(CommunicationException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_COULD_NOT_GET_USER_SID:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = typeof(CommunicationException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_ILLEGAL_FORMATNAME:
|
||
|
faultSender = false; faultReceiver = false; outerExceptionType = typeof(ArgumentException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_ILLEGAL_QUEUE_PATHNAME:
|
||
|
faultSender = false; faultReceiver = false; outerExceptionType = typeof(ArgumentException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_UNSUPPORTED_FORMATNAME_OPERATION:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = typeof(ArgumentException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_CANNOT_HASH_DATA_EX:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = typeof(CommunicationException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_CANNOT_SIGN_DATA_EX:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = typeof(CommunicationException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_FAIL_VERIFY_SIGNATURE_EX:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = typeof(CommunicationException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_BAD_SECURITY_CONTEXT:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = typeof(CommunicationException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_PRIVILEGE_NOT_HELD:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = typeof(CommunicationException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_SHARING_VIOLATION:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = typeof(AddressAccessDeniedException); break;
|
||
|
// transient errors
|
||
|
case UnsafeNativeMethods.MQ_ERROR_DTC_CONNECT:
|
||
|
faultSender = false; faultReceiver = true; outerExceptionType = typeof(CommunicationException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_IO_TIMEOUT:
|
||
|
faultSender = false; faultReceiver = false; outerExceptionType = typeof(TimeoutException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_QUEUE_NOT_AVAILABLE:
|
||
|
faultSender = false; faultReceiver = true; outerExceptionType = typeof(EndpointNotFoundException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_REMOTE_MACHINE_NOT_AVAILABLE:
|
||
|
faultSender = false; faultReceiver = true; outerExceptionType = typeof(EndpointNotFoundException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_SERVICE_NOT_AVAILABLE:
|
||
|
faultSender = false; faultReceiver = true; outerExceptionType = typeof(EndpointNotFoundException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_INSUFFICIENT_RESOURCES:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = typeof(CommunicationException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_MESSAGE_STORAGE_FAILED:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = typeof(CommunicationException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_TRANSACTION_ENLIST:
|
||
|
faultSender = false; faultReceiver = true; outerExceptionType = typeof(CommunicationException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_TRANSACTION_IMPORT:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = typeof(CommunicationException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_TRANSACTION_USAGE:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = typeof(InvalidOperationException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_STALE_HANDLE:
|
||
|
faultSender = false; faultReceiver = false; outerExceptionType = typeof(InvalidOperationException); break;
|
||
|
// malformed messages
|
||
|
case UnsafeNativeMethods.MQ_ERROR_ILLEGAL_MQQMPROPS:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = typeof(CommunicationException); break;
|
||
|
case UnsafeNativeMethods.MQ_ERROR_INSUFFICIENT_PROPERTIES:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = typeof(CommunicationException); break;
|
||
|
default:
|
||
|
faultSender = true; faultReceiver = true; outerExceptionType = null; break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal Exception Normalized
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
TuneBehavior();
|
||
|
if (null != this.outerExceptionType)
|
||
|
return Activator.CreateInstance(this.outerExceptionType, new object[] { this.Message, this }) as Exception;
|
||
|
else
|
||
|
return this;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static class MsmqError
|
||
|
{
|
||
|
|
||
|
[ResourceConsumption(ResourceScope.Process)]
|
||
|
public static string GetErrorString(int error)
|
||
|
{
|
||
|
StringBuilder stringBuilder = new StringBuilder(512);
|
||
|
|
||
|
bool result = false;
|
||
|
if ((error & 0x0FFF0000) == 0x000E0000)
|
||
|
{
|
||
|
int formatFlags = UnsafeNativeMethods.FORMAT_MESSAGE_IGNORE_INSERTS
|
||
|
| UnsafeNativeMethods.FORMAT_MESSAGE_ARGUMENT_ARRAY
|
||
|
| UnsafeNativeMethods.FORMAT_MESSAGE_FROM_HMODULE;
|
||
|
|
||
|
result = (0 != UnsafeNativeMethods.FormatMessage(
|
||
|
formatFlags,
|
||
|
Msmq.ErrorStrings,
|
||
|
error,
|
||
|
CultureInfo.CurrentCulture.LCID,
|
||
|
stringBuilder,
|
||
|
stringBuilder.Capacity,
|
||
|
IntPtr.Zero));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
int formatFlags = UnsafeNativeMethods.FORMAT_MESSAGE_IGNORE_INSERTS
|
||
|
| UnsafeNativeMethods.FORMAT_MESSAGE_ARGUMENT_ARRAY
|
||
|
| UnsafeNativeMethods.FORMAT_MESSAGE_FROM_SYSTEM;
|
||
|
|
||
|
result = (0 != UnsafeNativeMethods.FormatMessage(
|
||
|
formatFlags,
|
||
|
IntPtr.Zero,
|
||
|
error,
|
||
|
CultureInfo.CurrentCulture.LCID,
|
||
|
stringBuilder,
|
||
|
stringBuilder.Capacity,
|
||
|
IntPtr.Zero));
|
||
|
}
|
||
|
|
||
|
if (result)
|
||
|
{
|
||
|
stringBuilder = stringBuilder.Replace("\n", "");
|
||
|
stringBuilder = stringBuilder.Replace("\r", "");
|
||
|
return SR.GetString(
|
||
|
SR.MsmqKnownWin32Error,
|
||
|
stringBuilder.ToString(),
|
||
|
error.ToString(CultureInfo.InvariantCulture),
|
||
|
Convert.ToString(error, 16));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return SR.GetString(
|
||
|
SR.MsmqUnknownWin32Error,
|
||
|
error.ToString(CultureInfo.InvariantCulture),
|
||
|
Convert.ToString(error, 16));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|