Как продлить SoapException - PullRequest
       14

Как продлить SoapException

0 голосов
/ 27 сентября 2011

Я застрял, пытаясь расширить 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();
}
...