I have a web service in which I have created a custom exception. Let's say the name of this exception is InvalidContractException.
What I would like to do is if a specific step occurs, I want to throw this exception. However, I can't figure out how the client would catch the InvalidContractException in order to handle it properly.
This is an ASP.Net Web Service written in C#
You can't do this:
ASMX web services do not have proper support for SOAP Faults. There is no way to get any exception other than a SoapException on the client side.
Yet another reason to upgrade to WCF.
As an example of what you can't do with ASMX, here's how WCF works. WCF allows you to specify, for each web service operation, which faults it can return:
[ServiceContract]
public interface IMyServiceContract
{
[FaultContract(typeof(IntegerZeroFault))]
[FaultContract(typeof(SomeOtherFault))]
[OperationContract]
public string GetSomeString(int someInteger);
}
[DataContract]
public class IntegerZeroFault
{
[DataMember]
public string WhichInteger {get;set;}
}
[DataContract]
public class SomeOtherFault
{
[DataMember]
public string ErrorMessage {get;set;}
}
public class MyService : IMyServiceContract
{
public string GetSomeString(int someInteger)
{
if (someInteger == 0)
throw new FaultException<IntegerZeroFault>(
new IntegerZeroFault{WhichInteger="someInteger"});
if (someInteger != 42)
throw new FaultException<SomeOtherFault>(
new SomeOtherFault{ErrorMessage ="That's not the anaswer"});
return "Don't panic";
}
}
A WCF client can then catch FaultException<SomeOtherFault>
, for instance. When I've tried this with a Java client, it was able to catch SomeOtherFault
, which IBM Rational Web Developer created to derive from the Java Exception
class.
If your goal is to throw an exception so that a user can know that something went wrong, some specific exception occurred and have special handling for it, you do have an option. You just have to rely on a correct implementation of the client proxy (Indeed, one option is to provide the client proxies yourself).
There's a useful article availabe here about how SoapException
s work.
Essentially, it comes down to encoding your exception details (eg an error code) in the detail node of the SoapException
, and then parsing it on the client side before rethrowing the exception.
There's no way to recreate the exception as if it were thrown across the service boundary, and there's no automagical way to get anything except for a SoapException on the client side.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With