Moustafa Refaat
Login   Search
Skip Navigation Links
Home
Publications
Service Offerings
Downloads and Samples
My Resume
Endorsements
Contact Me
Books
Technical Articles
Software Packages
Scroll up
Scroll down
BizTalk The Practical Course
Mastering The BizTalk Technical Interview
Soduku:Challenging Puzzels
Scroll up
Scroll down
Design Patterns Review
Software Architecture Basics Review
Simplified BizTalk Content Based Routing for a Pass_Throu data
An Extensible Light Xml Rules Engine Component
Secure Messaging Solution
Create a SQL Database Programmatically
BizTalk Unzip Adapter
Implementing Singleton pattern with BizTalk Orchestrations
Developing BizTalk Custom Adapters
The BizTalk ESB Toolkit 2.0 experience Series
Scroll up
Scroll down
Setting the ESB Toolkit on the 64 Bit Machines
How The ESB Works
Sample Custom Resolver
Scroll up
Scroll down
Recent Training
Scroll up
Scroll down

News List

  • Toronto Code Camp Presentation is uploaded
  • BizTalk: The Practical Course is recommended by Micorsoft
  • Canadian Gigs Network (www.CanadianGigs.Net) a job web site focusing on Canadian Jobs
  • BizTalk Technical Interview Preparation
  • GT-DataSafe© Online Backup for Amazon Storage Services 3.0 is released
  • Soduku Challenging Puzzles
  • BizTalk: The Practical Course
  • Mastering The BizTalk Technical Interview is Published.

Technical Articles

  • SharePoint List Simplified Configuration Store
  • WCF and xsd:choice how to implement!
  • WCF: Refactoring a Plain old XML web service to a WCF Service
  • Setting the ESB Toolkit on the 64 Bit Machines
  • The BizTalk ESB Toolkit 2.0 experience Series
Skip Navigation Links
> Blog entries about: WCF
WCF and xsd:choice how to implement!
For some reason Microsoft decided that WCF serialization is not going to support the xsd:choice. The .Net XML serialization does support xsd:choice which is important. Now, if you had a schema that used xsd:Choice and used XSD tool to generate classes for it will generate code similar to:
///<remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Option1", typeof(typeOption11), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    [System.Xml.Serialization.XmlElementAttribute("Option2", typeof(typeOption2), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    [System.Xml.Serialization.XmlElementAttribute("Option3", typeof(typeOption3), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public object Item {
        get {
            return this.itemField;
        }
        set {
            this.itemField = value;
        }
Well that is look neat does not it? Now if you exposed this same generated code through WCF, the WSDL would generate item as Object on the client side and the consumer would not get any information from the WSDL about typeOption1, typeOption2, nor typeOption3. That is a real pain for the developer on the consumer side!. So one workaround that I had to device for a solution I was developing is to create another class like the following
public partial class Optionss {
 
    [System.Xml.Serialization.XmlElementAttribute("Option1", typeof(typeOption1), Form=System.Xml.Schema.XmlSchemaForm.Unqualified,IsNullable = true)]
    public typeOption1 Option1 = null;
    [System.Xml.Serialization.XmlElementAttribute("Optoin2", typeof(typeOption2), Form=System.Xml.Schema.XmlSchemaForm.Unqualified,IsNullable = true)]
    public typeOption2 Option2 = null;
    [System.Xml.Serialization.XmlElementAttribute("Option3", typeof(typeOption3), Form=System.Xml.Schema.XmlSchemaForm.Unqualified,IsNullable = true)]
    public typeOption3 Option3 = null;
 
}
And chenage the item above to be similar to
    public Optionss Item {
        get {
            return this.itemField;
        }
        set {
            this.itemField = value;
        }
 
Now the options are going to appear to the consumer, however the data you receive is going to be for a different schema so I wrote code that would serialize the received request then “fix” the XML to be corresponding to the actual schema with xsd:choice.  Not quite neat  workaround but it works.
{06/08/2010 2:21 PM} {0 comments}  {Tags: EAI, WCF, Web Developmenet}
WCF: Refactoring a Plain old XML web service to a WCF Service
Recently I was tasked to help devise a plan to refactor an application that was exposing non-compliant SOAP web services. I took a closer look at the application and decided that the best route would be to use the WCF to implement the refactored services. The old service had published XSDs for request and response of the web services. It was necessary to keep backward compatibility and keep these same XSDs valid for the new services.  With that in mind I devised the following plan
1.       Convert the schemas to CS classes using the XSD tool
2.       Create a new WCF Service Application
3.       On project click add existing items and add the two generated classes
4.       Rename the IService1.cs file to I[yourserviceName]Service.cs
5.       Change the Interface as follows
a. [ServiceContract(Namespace="your namespace")]
b.     [XmlSerializerFormat(Style=OperationFormatStyle.Document,Use=OperationFormatUse.Literal)]
 
6.       Include  a template for serializing and de-serializing classes (ObjectXMLSerializer.cs fond in downloads)  in your project
7. Rename the interface and change the method inside to have the form    
a. [OperationContract(Name = "Name", Action = "URL")]
b.              Response Service(Request req);
8.       Rename Service1.svc to Yourservicename.svc
9.       Open the code behind
10.   Rename the class and the inheriting interface
11.   Implement the method to be in form
    [ServiceBehavior(Namespace=”Your Name space ",IncludeExceptionDetailInFaults=true)]
   
    public class YourService : IYourService
    {
        public YourServiceResponse Service(YourServiceRequest req)
       
12.   Update the config.web file
      <servicename="YourServiceNameSpace.YourService"behaviorConfiguration="YourServiceNamespace.YOurService1Behavior">
                        <!-- Service Endpoints -->
                     <endpointaddress=""binding="wsHttpBinding"contract="YourServiceNameSpace.IYourService">
13.   Update the .svc file directive <%@ ServiceHost Language="C#" Debug="true" Service="YoursServiceNameSpace.YourService" CodeBehind="YourServiceService.svc.cs" %>
14.   Set .svc as the starting page press and the project as the starting project
15.   Now is the tricky part we add a Message wrapper class on the generated schema to control the message serialization, so  Open the CS Request Schema 
a.       ADD code similar to the following
using System.ServiceModel;
[MessageContract(IsWrapped = false)]
public class YourServiceRequest
{
    [MessageBodyMember(Name = "REQUEST", Namespace = "YourNameSpace")]
      public Request request;
}
b.      ADD code similar to the following
using System.ServiceModel;
[MessageContract(IsWrapped = false)]
public class YourServicesResponse
{
    [MessageBodyMember(Name="RESPONSE")]
    public Response response;
}
Press f5 you should see the service description press on WSDL and you will see the WSDL
Hope this helps:)
{18/05/2010 1:37 PM} {0 comments}  {Tags: WCF}

Copyright © Moustafa Refaat 2004 - 2009. All Rights Reserved.