Я застрял, пытаясь расширить SoapException
, чтобы добавить два дополнительных строковых атрибута.
У меня есть метод веб-службы, который должен выдавать CustomSoapException
, полученный из SoapException
, и я хочу поймать этот CustomSoapException
в клиенте веб-службы. Но когда я пытаюсь выставить CustomSoapException
клиенту веб-службы, добавив свойство [XmlInclude(typeof(CustomSoapException))]
в мой WebMethod, моя веб-служба ASMX
не запускается при запуске с сообщением:
Невозможно сериализовать член System.Exception.Data типа System.Collections.IDictionary, поскольку он реализует IDictionary.
Если кто-то может показать мне, как правильно сериализовать свойство Data
типа IDictionary
внутри моего CustomSoapException
, чтобы его можно было правильно выставить клиенту веб-службы. Я даже не собираюсь помещать какие-либо данные в свойство Data
. Возможно, его можно каким-то образом полностью удалить из расширенного класса, чтобы избежать необходимости его сериализации.
Вот мой код для CustomSoapException
:
[Serializable]
public class CustomSoapException : SoapException, ISerializable
{
private string customExceptionType;
private string developerMessage;
private string userMessage;
public override System.Collections.IDictionary Data
{
get
{
return base.Data;
}
}
public CustomSoapException(): base()
{
}
public string GetDeveloperMessage()
{
return developerMessage;
}
public string GetCustomExType()
{
return customExceptionType;
}
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
base.GetObjectData(info, context);
}
public CustomSoapException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
public CustomSoapException(string usrMessage, string devMessage, string customExType) : base(usrMessage, SoapException.ServerFaultCode)
{
customExceptionType = customExType;
developerMessage = devMessage;
userMessage = usrMessage;
}
}
Вот мой WebMethod код внутри asmx.cs
файла:
[WebMethod(EnableSession = true)]
[XmlInclude(typeof(CustomSoapException))]
public void testCustomExceptionPassing()
{
throw new CustomSoapException("user message", "developer message","customException");
}
Клиент веб-службы код:
try
{
Srv.testCustomExceptionPassing();
}
catch (SoapException ex) {
string devMessage = (ex as Srv.CustomSoapException).GetDeveloperMessage();
}