Monday, April 9, 2012

How to use ChannelFactory class in WCF client side code

ChannelFactory class is used in the way that create new channel with server side endpoints.
Msdn reference is here. http://msdn.microsoft.com/en-us/library/ms576132.aspx


The sample code is also here.
 static void Main(string[] args)  
 {  
   ChannelFactory<IEvalService> cf =   
     new ChannelFactory<IEvalService>("NetTcpBinding_IEvalService");  
   IEvalService channel = cf.CreateChannel();  

   Eval eval = new Eval();  
   eval.Submitter = "Shingo";  
   eval.Timesent = DateTime.Now;  
   eval.Comments = "I love WCF";  

   channel.SubmitEval(eval);  
   channel.SubmitEval(eval);  

   List<Eval> evals = channel.GetEvals();  

   Console.WriteLine("Number of evals : {0}", evals.Count);  
   ((IClientChannel)channel).Close();  

   Console.ReadLine();  
 }  

Simply, we can also write like this. EvalServiceClient class was generated when consuming  service reference.
 static void Main(string[] args)  
 {  
   EvalServiceClient channel = new EvalServiceClient("NetTcpBinding_IEvalService");  

   Eval eval = new Eval();  
   eval.Submitter = "Shingo";  
   eval.Timesent = DateTime.Now;  
   eval.Comments = "I love WCF";  

   channel.SubmitEval(eval);  
   channel.SubmitEval(eval);  

   List<Eval> evals = channel.GetEvals();  

   Console.WriteLine("Number of evals : {0}", evals.Count);  
   ((IClientChannel)channel).Close();  

   Console.ReadLine();  
 }  


In the code, I get the results of GetEvals method as List<>. You can set the results of collection type easily. The step is like this.

















You can choose here.


Friday, April 6, 2012

Running WCF with Console Application and introducing useful app.config editor tool

Usually, WCF runs on IIS Web server. But I studied that WCF can also run client application like console application, WPF application or more.

I also learned we can write service model element in app.config from code. (But we don't use usually.)

I'm gonna show you sample code.

 class Program  
 {  
   static void Main(string[] args)  
   {  
     ServiceHost host = new ServiceHost(typeof(EvalService));  
     host.AddServiceEndpoint(typeof(IEvalService),  
       new BasicHttpBinding(),  
       "http://localhost:8080/evals/basic");  
     host.AddServiceEndpoint(typeof(IEvalService),  
       new WSHttpBinding(),  
       "http://localhost:8080/evals/ws");  
     host.AddServiceEndpoint(typeof(IEvalService),  
       new NetTcpBinding(),  
       "net.tcp://localhost:8081/evals");  
     try  
     {  
       host.Open();  
       PrintServiceInfo(host);  
       Console.ReadLine();  
       host.Close();  
     }  
     catch (Exception ex)  
     {  
       Console.WriteLine(ex);  
       host.Abort();  
       Console.ReadLine();  
     }  
   }  
   static void PrintServiceInfo(ServiceHost host)  
   {  
     Console.WriteLine("{0} is up and running with these endpoints:",  
       host.Description.ServiceType);  
     foreach (ServiceEndpoint se in host.Description.Endpoints)  
       Console.WriteLine(se.Address);  
   }  
 }  

The result is like this.



So remarkably, you need run visual studio as Administrator.



  • WCF app.config Editor
You may feel pain to write app.config for WCF. There is excellent configuration tool for you.



You can easily edit app.config from GUI.


Thursday, April 5, 2012

Entry of Windows Communication Service (WCF)

I'm studying WCF. It's so nice and useful framework so that I'm going to log my understanding into the blog.


The simple WCF code is here.
 [DataContract]  
 public class Eval  
 {  
   [DataMember]  
   public string Submitter;  
   [DataMember]  
   public DateTime Timesent;  
   [DataMember]  
   public string Comments;  
 }  
 [ServiceContract]  
 public interface IEvalService  
 {  
   [OperationContract]  
   void SubmitEval(Eval eval);  
   [OperationContract]  
   List<Eval> GetEvals();  
 }  
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, 
    ConcurrencyMode=ConcurrencyMode.Multiple)]
 public class EvalService : IEvalService  
 {  
   List<Eval> evals = new List<Eval>();  
   public void SubmitEval(Eval eval)  
   {  
     evals.Add(eval);  
   }  
   public List<Eval> GetEvals()  
   {  
     return evals;  
   }  
 }  

So, I studied new things about ServiceBehavior attribute.
ServiceBehavior has two enum parameters mainly that are InstanceContextMode and ConcurrencyMode.
InstanceContextMode has Single, Percall, and Persession that are about instanciation. Also ConcurrencyMode has Single, Multiple, and Reentrant that are about threading.


In detail, here is msdn documents.
http://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.instancecontextmode.aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.concurrencymode.aspx


I'm going to continue this series depend on my study progress.
Thanks.

Monday, March 19, 2012

My memo app supports multilingualization in new version 1.7














http://windowsphone.com/s?appid=01fada6f-ff7e-451b-b0b0-3bf3a5c0f655

I'm really happy to announce my memo app's new release version 1.7 !
In new version, my memo app supports multilingualization that are English and Japanese.

And second feature is that you can choose character color (black or white). You can customize character color and background color as you want.

So, please check the function in bellow Yourtube video.



Please download my memo app in your Windows Phone ! 
Thanks.

Sunday, March 18, 2012

Cannot bind two types of data source to one UI target

I was also struggling the problem when I made binding between data source and UI ListBox target.
Today, I'd like to introduce the problem that we cannot bind "non-INotifyPropertyChanged property" and "INotifyPropertyChanged property" to same ListBox target.

First, I had written property binding like this. I had used "non-INotifyPropertyChanged property".

  • The xaml code is here.
 <ListBox Height="595" ItemsSource="{Binding}" HorizontalAlignment="Left" Margin="12,6,0,0" Name="listBox1" VerticalAlignment="Top" Width="438">  
   <ListBox.ItemTemplate>  
     <DataTemplate>  
       <StackPanel HorizontalAlignment="Stretch" Orientation="Horizontal">  
         <TextBlock x:Name="Name1" FontSize="35" Text="{Binding Text1}" Foreground="Black"/>  
         <TextBlock x:Name="Name2" FontSize="35" Text="{Binding Text2}" Foreground="Black"/>  
       </StackPanel>  
     </DataTemplate>  
   </ListBox.ItemTemplate>  
 </ListBox>  
  • The code behind is here.
 public partial class MainPage : PhoneApplicationPage  
 {  
   // Constructor  
   public MainPage()  
   {  
     InitializeComponent();  
     GetList();  
   }  

   public void GetList()  
   {  
     List<ItemProperties> items = new List<ItemProperties>();  
     items.Add(new ItemProperties { Text1 = "test01", Text2 = "test02" });  
     items.Add(new ItemProperties { Text1 = "test11", Text2 = "test12" });  
     listBox1.ItemsSource = items;  
   }  
 }  

 public class ItemProperties  
 {  
   private string m_Text1;  
   public string Text1  
   {  
     get { return m_Text1; }  
     set { m_Text1 = value; }  
   }  

   private string m_Text2;  
   public string Text2  
   {  
     get { return m_Text2; }  
     set { m_Text2 = value; }  
   }  
 }  


Second, I wanted to bind Foreground color in ListBox. So, I added "INotifyPropertyChanged property" as Foreground colors.
The code is like this. But I found I couldn't bind "INotifyPropertyChanged property" to Foreground color in this code.

  • The xaml code is here.
 <ListBox Height="595" ItemsSource="{Binding}" HorizontalAlignment="Left" Margin="12,6,0,0" Name="listBox1" VerticalAlignment="Top" Width="438">  
   <ListBox.ItemTemplate>  
     <DataTemplate>  
       <StackPanel HorizontalAlignment="Stretch" Orientation="Horizontal">  
         <TextBlock x:Name="Name1" FontSize="35" Text="{Binding Text1}" Foreground="{Binding Color1}"/>  
         <TextBlock x:Name="Name2" FontSize="35" Text="{Binding Text2}" Foreground="{Binding Color2}"/>  
       </StackPanel>  
     </DataTemplate>  
   </ListBox.ItemTemplate>  
 </ListBox>  
  • The code behind is here.
 public partial class MainPage : PhoneApplicationPage  
 {  
   public ObservableCollection<ItemProperties2> ItemCollection { get; private set; }  
   // Constructor  
   public MainPage()  
   {  
     InitializeComponent();  
     GetList();  
     GetList2();  
   }  

   public void GetList()  
   {  
     List<ItemProperties> items = new List<ItemProperties>();  
     items.Add(new ItemProperties { Text1 = "test01", Text2 = "test02" });  
     items.Add(new ItemProperties { Text1 = "test11", Text2 = "test12" });  
     listBox1.ItemsSource = items;  
   }  

   public void GetList2()  
   {  
     ItemCollection = new ObservableCollection<ItemProperties2>();  
     ItemCollection.Add(new ItemProperties2  
     {  
       Color1 = new SolidColorBrush(Colors.LightGray),  
       Color2 = new SolidColorBrush(Colors.Brown)  
     });  
     ItemCollection.Add(new ItemProperties2  
     {  
       Color1 = new SolidColorBrush(Colors.Cyan),  
       Color2 = new SolidColorBrush(Colors.Red)  
     });  
     DataContext = ItemCollection;  
   }  
 }  

 public class ItemProperties  
 {  
   private string m_Text1;  
   public string Text1  
   {  
     get { return m_Text1; }  
     set { m_Text1 = value; }  
   }  

   private string m_Text2;  
   public string Text2  
   {  
     get { return m_Text2; }  
     set { m_Text2 = value; }  
   }  
 }  

 public class ItemProperties2 : INotifyPropertyChanged  
 {  
   public event PropertyChangedEventHandler PropertyChanged;  
   public ItemProperties2() { }  

   private Brush m_Color1;  
   public Brush Color1  
   {  
     get { return m_Color1; }  
     set  
     {  
       m_Color1 = value;  
       OnPropertyChanged("Color1");  
     }  
   }  

   private Brush m_Color2;  
   public Brush Color2  
   {  
     get { return m_Color2; }  
     set  
     {  
       m_Color2 = value;  
       OnPropertyChanged("Color2");  
     }  
   }  

   protected void OnPropertyChanged(string name)  
   {  
     PropertyChangedEventHandler handler = this.PropertyChanged;  
     if (handler != null)  
       handler(this, new PropertyChangedEventArgs(name));  
   }  
 } 


It seems that "non-INotifyPropertyChanged property" is given priority over "INotifyPropertyChanged property".

I think the problem is a little foolish in now. But If your code is quite large amount, you may not be able to find the problem immediately.
I write previous blog post as the answer for the problem. Please check it also.