Here’s two things that caused me a bit of pain when working with WCF. Hopefully these pointers should help you get back to more productive things.
No Output when returning Serialized / Serialised objects.
I had been working on adding a significant number of methods and properties to a series of classes, and when I went to test the service I got literally no output.
Debug points indicated that all properties were there, and valid - but still WCF wasn’t returning anything. There was no exceptions being returned to the client.
The best tool for debugging these sorts of solutions is to first of all enable Tracing and MessageLogging. This is done via the WCF Service Configuration Editor, on the Diagnostics tab.
Once you’ve done that, and re-run the projects - you can open up Service Trace Viewer. For me under Visual Studio 2008, this was under Microsoft Windows SDK v6.0A > Tools.
This tool then lets you open up the trace log generated in your solution directory, and see all the activity that’s been happening.
From here, it was just a matter of scrolling down to the activity entry that had the yellow hilighting (indicating a warning), selecting it - then clicking on the Errors.
For me, the first time this happened to me, it was because I had stuffed up the DataMember Name values. It has also occurred for other reasons, such as a property not being populated, when I had specified that it was both required, and also that it could not emit a default value.
Can’t get mex to work
No, this isn’t a misguided racial slur. I was having issues setting up the mexHttpBinding on an ASP.NET AJAX WCF Service.
The solutions all point towards the same thing, that you need to set up an endpoint, and set the contract to IMetaDataExchange, then set the behaviour to have <serviceMetadata />. Except that it just wouldn’t let me add that property to my endpoint behaviour, and whenever I changed it to a service behaviour it would then not allow me to set the other properties I needed for that.
Well, perhaps I’m particularly slow - but hopefully this pointer will help someone else.
1: Create a NEW service behaviour:
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata
httpGetEnabled="true"/>
<serviceDebug
includeExceptionDetailInFaults="true"
/>
</behavior></serviceBehaviors>
2: Add a new endpoint to your existing service
<endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" contract="IMetadataExchange" />
3: Add the behaviorConfiguration you added in Step 1 to the Service (NOT the endpoint).
<service behaviorConfiguration=”MyServiceBehavior” name=”MyProject.MyService”>
I kept trying to add it to the endpoint, and failing miserably. So much time spent back-and-forth on this!
That’s it for this instalment of “WCF is great, but I wish the config was a bit easier to understand”. Stay tuned for more exciting episodes!
