TheHvidsten
TheHvidsten

Reputation: 4418

WCF FaultException inconsistency

I have a WCF service that throws FaultExceptions when something goes wrong. Some of the error classes being thrown works just fine, yet some of the other doesn't work at all and give the following error:

An error occured while receiving the HTTP response to http://localhost/MyService. This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down).

With an inner exception saying

The underlying connection was closed: An unexpected error occurred on a receive.

My code works thusly:

Server

public Stream DoSomething() {
    if (someCondition) {
        if (fileExists) {
            return new Stream(); // I know I can't do this, but for example purpose only :)
        }
        throw new FaultException<System.IO.FileNotFoundException>(new FileNotFoundException());
    }
    throw new FaultException<MyException>(new MyException());
}

Exception class

public class MyException: Exception
{
}

Client

try {
    wcfClient.DoSomething();
} catch (FaultException<FileNotFoundException>) {
    // This works just fine
} catch (FaultException<MyException>) {
    // This gives the error listed above
}

Both FileNotFoundException and MyException are set up in the contract:

[FaultContract(typeof(FileNotFoundException))]
[FaultContract(typeof(MyException))]

Why does FaultException<FileNotFoundException> work as expected, but not FaultException<MyException>?

If I remove Exception inheritance from MyException everything works as it should (but I want consistency, so I want it to be an actual exception). There is no change if Exception inheritance is left in, but it is decorated with [DataContract].

Why is that? FileNotFoundException inherits from Exception too. One works, the other doesn't. Frustrating!

P.S.: Both the server and the client share the same assembly the interfaces and classes are defined in, so there shouldn't be any contract mismatches.

Upvotes: 1

Views: 88

Answers (1)

nvoigt
nvoigt

Reputation: 77285

Your exception should probably be [Serializable]. I think that would solve your problem already.

As a best practice for Exceptions you should also implement the three constructors.

Upvotes: 1

Related Questions