Transmission protocol: it can be http, https tutorial, tcp, named pipe, or msmq.
Message Encoding: describes how to format a message. It can be binary, text, or mtom.
Message version: it can be soap1.1 or soap1.2. You can also set whether the message version supports the ws-addressing protocol. When operating with the non-. net platform, pay attention to the choice of message version.
Each binding has several binding elements. You can use the following code to view the default binding element and the message version used for binding.
Using system;
Using system. collections. generic;
Using system. text;
Using system. servicemodel;
Using system. servicemodel. channels;
Namespace wcfbinding
{
Class program
{
Static void main (string [] args)
{
Outputbindingelements (new basichttpbinding ());
Outputbindingelements (new wshttpbinding ());
Outputbindingelements (new nettcpbinding ());
Outputbindingelements (new netnamedpipebinding ());
Outputbindingelements (new netmsmqbinding ());
Console. readline ();
}
Static void outputbindingelements (binding)
{
Console. writeline ("binding: {0}", binding. gettype (). name );
Console. writeline ("messageversion: {0}", binding. messageversion );
Bindingelementcollection elements = binding. createbindingelements ();
Foreach (bindingelement element in elements)
{
Console. writeline ("{0}", element. gettype (). fullname );
}
Console. writeline ();
}
}
}
The result shows that only basichttpbinding uses soap1.1 and is addressingnone. Other bindings use the message version soap1.2 and addressing10. Below we will write some code to view the messages formatted in these two message formats. To easily change the message version, use the custombinding class to define custom binding:
Using system;
Using system. runtime. serialization;
Namespace fruitmodel
{
[Datacontract (namespace = "http://www.111cn.net")]
Public class fruit
{
Private string m_name = string. empty;
Private string m_price = string. empty;
Public fruit (string name, string price)
{
M_name = name;
M_price = price;
}
[Datamember]
Public string name
{
Get {return m_name ;}
Set {m_name = value ;}
}
[Datamember]
Public string price
{
Get {return m_price ;}
Set {m_price = value ;}
}
}
[Datacontract (namespace = "http://www.111cn.net")]
Public class fruitheader
{
Private string m_headerkey = string. empty;
[Datamember]
Public string headerkey
{
Get {return m_headerkey ;}
Set {m_headerkey = value ;}
}
Public fruitheader (string key)
{
M_headerkey = key;
}
}
}
Service contract:
Using system;
Using system. servicemodel;
Using system. servicemodel. channels;
Using fruitmodel;
Namespace ifruitservice
{
[Servicecontract (namespace = "http://www.111cn.net")]
Public interface ifruitpriceservice
{
[Operationcontract (action = "*", replyaction = "*")]
Message getfruit (message m );
}
}
Service implementation:
Using system;
Using system. runtime. serialization;
Using system. servicemodel;
Using system. servicemodel. channels;
Using ifruitservice;
Using fruitmodel;
Namespace fruitpriceservice
{
Public class fruitpriceservice: ifruitpriceservice
{
Public message getfruit (message m)
{
Console. writeline (m. tostring ());
Message = message. createmessage (m. version, "*", new fruit ("banana", "6.00 "));
Messageheader mheader = messageheader. createheader ("fruitresponseheader ",
Http://www.111cn.net, new fruitheader ("response "));
Message. headers. add (mheader );
Return message;
}
}
}
Storage service:
Using system;
Using system. servicemodel;
Using system. servicemodel. channels;
Using system. text;
Using ifruitservice;
Namespace wcfmessagehost
{
Class program
{
Static void main (string [] args)
{
Using (servicehost host = new servicehost (typeof (fruitpriceservice. fruitpriceservice ),
New uri ("http: // localhost: 8000 /")))
{
Textmessageencodingbindingelement textelement = new textmessageencodingbindingelement (
Messageversion. soap12wsaddressing10, encoding. utf8 );
Custombinding custombind = new custombinding ();
Custombind. elements. add (textelement );
Custombind. elements. add (new httptransportbindingelement ());
Host. addserviceendpoint (typeof (ifruitpriceservice), custombind, "fruitservice ");
Host. open ();
Console. writeline ("fruit service is running ...");
Console. readline ();
}
}
}
}
Client call:
Using system;
Using system. servicemodel;
Using system. servicemodel. channels;
Using system. runtime. serialization;
Using system. text;
Using ifruitservice;
Using fruitmodel;
Namespace wcfmessageclient
{
Class program
{
Static void main (string [] args)
{
Console. writeline ("fruit client is running ...");
Endpointaddress epaddr = new endpointaddress ("http: // localhost: 8000/fruitservice ");
Textmessageencodingbindingelement textelement = new textmessageencodingbindingelement (
Messageversion. soap12wsaddressing10, encoding. utf8 );
Custombinding custombind = new custombinding ();
Custombind. elements. add (textelement );
Custombind. elements. add (new httptransportbindingelement ());
Ifruitpriceservice proxy = channelfactory <ifruitpriceservice>. createchannel (custombind, epaddr );
Messageheader mheader = messageheader. createheader ("fruitheader", "http://www.111cn.net ",
New fruitheader ("password "));
Message = message. createmessage (messageversion. soap12wsaddressing10 ,"*",
New fruit ("apple", "4.00 "));
Message. headers. add (mheader );
Message m = proxy. getfruit (message );
Console. writeline (m. tostring ());
Console. readline ();
}
}
}