Wednesday, April 23, 2008

A SilverLight-WCF Chat



kick it on DotNetKicks.com

Introduction



This is very simple and basic SilverLight-WCF chat application that uses basicHttpBinding and a timer to call the
WCF service in order to refresh the SilverLight client each certain amount of time.





Technique


The solution consists of:




  • ASP.NET Web Project


    • ASP.NET page to host the SilverLight application

    • WCF Service which contains two generic lists to hold online chatters and messages history



  • SilverLight Project (Client)



SilverLight client calls the Join() method and starts the timer, the timer ticks every two seconds
and calls GetChatters() and GetMessages() methods, client now is free to call
Say() method to send message to other clients or call Leave() method to disconnect
from the service and stop the timer.



WCF service responds to client calls to add or remove Client or Message from
the generic lists, or send these lists back to the client.



The Code



WCF Service


This is the service contract



[ServiceContract]
public interface IbasicChatService
{
[OperationContract(IsOneWay = false)]
bool Join(Chatter _chatter);

[OperationContract(IsOneWay = true)]
void Say(Message _msg);

[OperationContract(IsOneWay = false)]
List< Chatter> GetChatters();

[OperationContract(IsOneWay = false)]
List< Message> GetMessages();

[OperationContract(IsOneWay = true)]
void Leave(Chatter _chatter);
}


This is the client and message data contracts



[DataContract]
public class Chatter
{
private string _name;
private DateTime _time;

[DataMember]
public string Name
{
get { return _name; }
set { _name = value; }
}

[DataMember]
public DateTime Time
{
get { return _time; }
set { _time = value; }
}
}

[DataContract]
public class Message
{
private string _sender;
private string _content;
private DateTime _time;

[DataMember]
public string Sender
{
get { return _sender; }
set { _sender = value; }
}

[DataMember]
public string Content
{
get { return _content; }
set { _content = value; }
}

[DataMember]
public DateTime Time
{
get { return _time; }
set { _time = value; }
}
}



This is the service implementation



[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single,
ConcurrencyMode=ConcurrencyMode.Multiple)]
public class basicChatService : IbasicChatService
{

private List< Chatter> chatters = new List< Chatter>();
private List< Message> messages = new List< Message>();

private object syncObj = new object();


#region IbasicChatService Members

public bool Join(Chatter _chatter)
{
foreach (Chatter chtr in this.chatters)
{
if (chtr.Name == _chatter.Name)
{
return false;
}
}

lock (syncObj)
{
this.chatters.Add(_chatter);

Message msg = new Message();
msg.Sender = "Service";
msg.Content = "---- " + _chatter.Name + " joined chat ----";
msg.Time = DateTime.Now;

this.messages.Add(msg);
}

return true;
}

public void Say(Message _msg)
{
lock (syncObj)
{
this.messages.Add(_msg);
}
}

public List< Chatter> GetChatters()
{
return this.chatters;
}

public List< Message> GetMessages()
{
return this.messages;
}

public void Leave(Chatter _chatter)
{

foreach (Chatter chtr in this.chatters)
{
if (chtr.Name == _chatter.Name)
{
this.chatters.Remove(chtr);

if (this.chatters.Count < 1)
{
this.messages.Clear();
return;
}
Message msg = new Message();
msg.Sender = "Server";
msg.Content = "---- " + _chatter.Name + " leftt chat ----";
msg.Time = DateTime.Now;

this.messages.Add(msg);

return;
}
}
}

#endregion
}


To integrate SilverLight application with WCF service you have to use basicHttpBinding as followed in the
service configuarion file



< system.serviceModel>
< serviceHostingEnvironment aspNetCompatibilityEnabled="true">
< /serviceHostingEnvironment>
< services>
< service behaviorConfiguration="SilverlightApp_Host.basicChatServiceBehavior"
name="SilverlightApp_Host.basicChatService">
< host>
< baseAddresses>
< add baseAddress="http://localhost:6464/localsystem"/>
< /baseAddresses>
< /host>
< endpoint address=""
binding="basicHttpBinding"
contract="SilverlightApp_Host.IbasicChatService">
< identity>
< dns value="localhost"/>
< /identity>
< /endpoint>
< endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
< /service>
< /services>
< behaviors>
< serviceBehaviors>
< behavior name="SilverlightApp_Host.basicChatServiceBehavior">
< serviceMetadata httpGetEnabled="true"/>
< serviceDebug includeExceptionDetailInFaults="true"/>
< /behavior>
< /serviceBehaviors>
< /behaviors>
< bindings>
< basicHttpBinding>
< binding name="basicBinding"
closeTimeout="00:00:20"
maxBufferPoolSize="1048576"
maxBufferSize="1048576"
maxReceivedMessageSize="1048576"
openTimeout="00:00:20"
receiveTimeout="01:00:00"
sendTimeout="00:01:00"
transferMode="Buffered">
< readerQuotas maxArrayLength="1048576" maxBytesPerRead="1048576"
maxStringContentLength="1048576"/>
< security mode="None">
< transport clientCredentialType="Windows"/>
< /security>
< /binding>
< /basicHttpBinding>
< /bindings>
< /system.serviceModel>



SilverLight Client



I'm a very bad designer so I'll let you imagine any design for this application which of course will be better than
this, this is just two list boxes to hold the online chatters and messages history coming from the service, other
controls are three buttons to join, leave the chat or send a message, and two textboxes for chatter name, and message.



This is the application xaml code



< UserControl x:Class="SilverlightApp.Page"
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
< Grid x:Name="LayoutRoot" >

< Grid.Background>
< LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
< GradientStop Color="Black" Offset="0"/>
< GradientStop Color="LavenderBlush" Offset="1"/>
< /LinearGradientBrush>
< /Grid.Background>

< Grid.RowDefinitions>
< RowDefinition Height="50"/>
< RowDefinition Height="25"/>
< RowDefinition Height="25"/>
< RowDefinition Height="200"/>
< RowDefinition Height="30"/>
< RowDefinition Height="50"/>
< /Grid.RowDefinitions>
< Grid.ColumnDefinitions>
< ColumnDefinition Width="70"/>
< ColumnDefinition Width="360"/>
< ColumnDefinition Width="120"/>
< ColumnDefinition Width="70"/>
< /Grid.ColumnDefinitions>

< TextBlock x:Name="labelStatus"
Margin="8, 5, 2, 2"
Grid.Row="1"
Grid.Column="2"
FontFamily="Consolas"
FontSize="13"
Foreground="White">Offline< /TextBlock>

< Grid x:Name="layoutLogin" Grid.Row="2" Grid.Column="1">
< Grid.RowDefinitions>
< RowDefinition Height="25" />
< /Grid.RowDefinitions>
< Grid.ColumnDefinitions>
< ColumnDefinition Width="80"/>
< ColumnDefinition Width="160"/>
< ColumnDefinition Width="*"/>
< /Grid.ColumnDefinitions>

< TextBlock FontFamily="Consolas"
Margin="4, 2, 2, 0"
Grid.Row="0"
Grid.Column="0"
FontSize="12"
Foreground="White">User Name:< /TextBlock>

< TextBox x:Name="textboxName"
Margin="2, 2, 2, 2"
Grid.Row="0"
Grid.Column="1">< /TextBox>

< Button x:Name="buttonJoin"
Background="Transparent"
Margin="2, 2, 2, 2"
Grid.Row="0"
Grid.Column="2"
Click="buttonJoin_Click"
Content="Join">< /Button>

< /Grid>

< Button x:Name="buttonLeave"
Background="Transparent"
Margin="2, 2, 2, 2"
Click="buttonLeave_Click"
Grid.Row="2"
Grid.Column="2"
Content="Leave">< /Button>

< ListBox x:Name="listBoxMsgs"
LayoutUpdated="listBoxMsgs_LayoutUpdated"
Margin="2, 2, 2, 2"
Grid.Row="3"
Grid.Column="1">< /ListBox>

< ListBox x:Name="listBoxNames"
Margin="2, 2, 2, 2"
Grid.Row="3"
Grid.Column="2">< /ListBox>

< TextBox x:Name="textboxMsg"
Margin="2, 2, 2, 2"
Grid.Row="4"
Grid.Column="1">< /TextBox>

< Button x:Name="buttonSend"
Background="Transparent"
Margin="2, 2, 2, 2"
Grid.Row="4"
Grid.Column="2"
Click="buttonSend_Click"
Content="Send">< /Button>

< /Grid>
< /UserControl>



SilverLight client implementation consists of some feilds, constructor, connection event handlers, private methods, and UI event handlers


Feilds



namespace SilverlightApp
{
public partial class Page : UserControl
{

#region Feilds

//TIMER
DispatcherTimer _timer = null;

SVC.IbasicChatServiceClient proxy = null;
SVC.Chatter localChatter = null;

//List to hold online chatters
List< SVC.Chatter> chatters = new List< SilverlightApp.SVC.Chatter>();

//List to hold messages history
List< SVC.Message> messages = new List< SilverlightApp.SVC.Message>();

//To enable listbox auto scroll
bool flag = false;

#endregion

...



Page constructor



public Page()
{
InitializeComponent();
buttonLeave.IsEnabled = false;
buttonSend.IsEnabled = false;
textboxMsg.KeyDown += new KeyEventHandler(textboxMsg_KeyDown);

//Create Timer and set interval
_timer = new DispatcherTimer();
_timer.Interval = TimeSpan.FromSeconds(2);
_timer.Tick += new EventHandler(_timer_Tick);
}



Connection event handlers




#region Connection Event Handlers

void proxy_JoinCompleted(object sender, SilverlightApp.SVC.JoinCompletedEventArgs e)
{
if (e.Result)
{
labelStatus.Text = "Online";
this._timer.Start();
}
else
{
proxy.Close();
labelStatus.Text = "Name Found";
}
}

void proxy_LeaveCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
proxy.Close();
}

void proxy_GetMessagesCompleted(object sender, SilverlightApp.SVC.GetMessagesCompletedEventArgs e)
{
listBoxMsgs.Items.Clear();
foreach (SVC.Message msg in e.Result)
{
//This will not scroll the listbox
//listBoxMsgs.Items.Add(msg.Sender + " : " + msg.Content);

//Auto scroll, AddItem() is a private method
AddItem(msg.Sender + " : " + msg.Content);
flag = true;
}

}

void proxy_GetChattersCompleted(object sender, SilverlightApp.SVC.GetChattersCompletedEventArgs e)
{
listBoxNames.Items.Clear();
foreach (SVC.Chatter chtr in e.Result)
{
listBoxNames.Items.Add(chtr.Name);
}
}

void InnerChannel_Opened(object sender, EventArgs e)
{
HandleProxy();
}

void InnerChannel_Faulted(object sender, EventArgs e)
{
HandleProxy();
}

void InnerChannel_Closed(object sender, EventArgs e)
{
HandleProxy();
}


#endregion



Private methods



#region Private Methods

public void AddItem(String messageText)
{
listBoxMsgs.Items.Add(new ListBoxItem { Content = messageText });
}

private void Join()
{
proxy = null;
//CREATE PROXY
proxy = new SilverlightApp.SVC.IbasicChatServiceClient();
proxy.InnerChannel.Closed += new EventHandler(InnerChannel_Closed);
proxy.InnerChannel.Faulted += new EventHandler(InnerChannel_Faulted);
proxy.InnerChannel.Opened += new EventHandler(InnerChannel_Opened);

//CREATE LOCAL CLIENT
this.localChatter = new SilverlightApp.SVC.Chatter();
this.localChatter.Name = textboxName.Text.ToString();
this.localChatter.Time = DateTime.Now;

//JOIN()
proxy.JoinAsync(this.localChatter);
proxy.JoinCompleted +=
new EventHandler< SilverlightApp.SVC.JoinCompletedEventArgs>(proxy_JoinCompleted);
}

private void Send()
{
if (proxy != null && proxy.State == CommunicationState.Opened)
{
SVC.Message msg = new SilverlightApp.SVC.Message();
msg.Sender = this.localChatter.Name;
msg.Content = textboxMsg.Text.ToString();
msg.Time = DateTime.Now;

proxy.SayAsync(msg);
textboxMsg.Text = "";
}
else
{
HandleProxy();
}
}

private void HandleProxy()
{
if (proxy != null)
{
switch (proxy.State)
{
case CommunicationState.Closed:
proxy = null;
labelStatus.Text = "Offline";
buttonJoin.IsEnabled = true;
buttonLeave.IsEnabled = false;
buttonSend.IsEnabled = false;
listBoxMsgs.Items.Clear();
listBoxNames.Items.Clear();
break;
case CommunicationState.Closing:
break;
case CommunicationState.Created:
break;
case CommunicationState.Faulted:
proxy.Abort();
proxy = null;
labelStatus.Text = "Offline";
buttonJoin.IsEnabled = true;
buttonLeave.IsEnabled = false;
buttonSend.IsEnabled = false;
listBoxMsgs.Items.Clear();
listBoxNames.Items.Clear();
break;
case CommunicationState.Opened:
buttonJoin.IsEnabled = false;
buttonLeave.IsEnabled = true;
buttonSend.IsEnabled = true;
labelStatus.Text = "Online";
break;
case CommunicationState.Opening:
break;
default:
break;
}
}
else
{
//Join();
}
}

#endregion


And finally the UI event handlers



#region UI Events

void _timer_Tick(object sender, EventArgs e)
{
//Refresh online chatters and messages by calling GetChattersAsync() and GetMessagesAsync()
proxy.GetChattersAsync();
proxy.GetChattersCompleted +=
new EventHandler< SilverlightApp.SVC.GetChattersCompletedEventArgs>(proxy_GetChattersCompleted);

proxy.GetMessagesAsync();
proxy.GetMessagesCompleted +=
new EventHandler< SilverlightApp.SVC.GetMessagesCompletedEventArgs>(proxy_GetMessagesCompleted);
}

void textboxMsg_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
Send();
}
}

private void buttonJoin_Click(object sender, RoutedEventArgs e)
{
Join();
}

private void buttonSend_Click(object sender, RoutedEventArgs e)
{
Send();
}

private void buttonLeave_Click(object sender, RoutedEventArgs e)
{
this._timer.Stop();
if (proxy != null && proxy.State == CommunicationState.Opened)
{
proxy.LeaveAsync(this.localChatter);
proxy.LeaveCompleted +=
new EventHandler< System.ComponentModel.AsyncCompletedEventArgs>(proxy_LeaveCompleted);
}
else
{
HandleProxy();
}
}

private void listBoxMsgs_LayoutUpdated(object sender, EventArgs e)
{
if (flag && listBoxMsgs.Items.Count > 1)
{
listBoxMsgs.ScrollIntoView(listBoxMsgs.Items[listBoxMsgs.Items.Count - 1]);
flag = false;
}
}

#endregion




Other Stuff


Enable cross domain calls for SilverLight application


In order to enable cross domain calls just copy this file clientaccesspolicy.xml to your host root, if you use IIS then
copy the file to WWWRoot folder and then restart IIS. (file is included in the source code).

110 comments:

Nick said...

Hello, Thank you for posting this code. I am getting a protocol exception "The remote server returned an unexpected response: (404) Not Found." when I send a message. Specifically this happens in the EndSay method of Reference.cs, which is generated in the service reference SCV. I suspect this error has something to do with the endpoint configuration but I can't figure it out. Any ideas?

Islam Eldemery said...

Thanks, I don't know, never seen this exception message before, Could you include exception details in faults and implement try catch fault exception in the service to know exactly where the exception comes from?..

Anonymous said...

I am also having the 404 problem.
It happens in Reference.cs:505 after sending a message.

System.ServiceModel.CommunicationException wurde nicht von Benutzercode behandelt.
Message="The remote server returned an error: NotFound"
StackTrace:
bei System.ServiceModel.AsyncResult.End[TAsyncResult](IAsyncResult result)
bei System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.End(SendAsyncResult result)
bei System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result)
bei System.ServiceModel.ClientBase`1.ChannelBase`1.EndInvoke(String methodName, Object[] args, IAsyncResult result)
bei SilverlightApp.SVC.IbasicChatServiceClient.IbasicChatServiceClientChannel.EndSay(IAsyncResult result)
bei SilverlightApp.SVC.IbasicChatServiceClient.SilverlightApp.SVC.IbasicChatService.EndSay(IAsyncResult result)
bei SilverlightApp.SVC.IbasicChatServiceClient.OnEndSay(IAsyncResult result)
bei System.ServiceModel.ClientBase`1.OnAsyncCallCompleted(IAsyncResult result)
InnerException: System.Net.WebException
Message="The remote server returned an error: NotFound"
StackTrace:
bei System.Net.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)
bei System.Net.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
bei System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result)
InnerException: System.Net.WebException
Message="The remote server returned an error: NotFound"
StackTrace:
bei System.Net.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
bei System.Net.BrowserHttpWebRequest.<>c__DisplayClass5. EndGetResponse b__4(Object sendState)
bei System.Net.AsyncHelper.<>c__DisplayClass2. BeginOnUI b__0(Object sendState)
InnerException:

Anonymous said...

Should you tell it — a false way. achat levitra Amazingly! Amazingly!

Anonymous said...

Je, pardon, mais cela ne me conviens pas du tout certes. Qui encore, peut aider ? http://cgi1.ebay.fr/eBayISAPI.dll?ViewUserPage&userid=acheter-cialis cialis sans ordonnances, acheter cialis

Anonymous said...

que dans un tel cas il faut faire ? acheter viagra acheter du viagra

Anonymous said...

Quels mots nГ©cessaires... super, la phrase brillante runfr.com cialis [url=http://runfr.com]achat cialis en ligne[/url]

Anonymous said...

Je fГ©licite, vous Г©tiez visitГ©s par l'idГ©e simplement excellente acheter du cialis acheter cialis [url=http://runfr.com/acheter-cialis]acheter cialis[/url]

Anonymous said...

how to buy cialis
mail order cialis china
cheap cialis india
what does generic cialis look like
how to get cialis no prescription
buy discount cialis online
online cialis canada
buy cialis online on sale 2000 buy cialis daily f

Anonymous said...

[url=http://www.playlist.com/blog/entry/12464022019]buying buy Levitra online[/url]
[url=http://www.playlist.com/blog/entry/12464011267]cialis brand name[/url]
[url=http://www.playlist.com/blog/entry/12464011267]cialis and grapefruit juice[/url]
[url=http://www.playlist.com/blog/entry/12464022019]chemical name for levitra[/url]
[url=http://www.playlist.com/blog/entry/12464022019]what is levitra[/url]
[url=http://www.playlist.com/blog/entry/12464030467]KAMAGRA SOFT Lowell[/url]

kamagra jelly supplier
Purchase In Nisku (Alberta) [url=http://www.wikipatterns.com/display/~zaeblo] where to buy online kamagra oral jelly[/url] buy kamagra oral jelly shipped ups.

Purchase In Bangor [url=http://www.wikipatterns.com/display/~toprol] toprol xl online saturday delivery[/url] cheap toprol xl 60 pills x 100 mg online.

Purchase In California [url=http://www.wikipatterns.com/display/~wertinskoi] Generic Viagra With American Express[/url] buy viagra $8 per pill.
Order In St. Jean-Sur-Richelieu (Quebec) [url=http://www.wikipatterns.com/display/~zerguni] buy Levitra online consultation us[/url] buy Levitra Plus diet pills. Buy In Norwich [url=http://www.wikipatterns.com/display/~thirtywow] chip kamagra[/url] Online generic Kamagra.

Buy In Elliot Lake (Ontario) [url=http://www.wikipatterns.com/display/~semen] cheap online propecia[/url] propecia versus rogaine. Order In Nordegg (Alberta) [url=http://connections.blackboard.com/people/4b1319a5ad] where can i buy viagra in[/url] buy cheap viagra online now uk.

Anonymous said...

When you sort Viagra or some other meds in our machine shop you may be reliable http://ipod-playlist.com/viagra.html discount Viagra Online that this issue simply of pre-eminent distinction bequeath be delivered to you systematically in time.

Anonymous said...

Aujourd'hui je lisais beaucoup sur cette question. http://www.ci2s.org cialis [url=http://www.ci2s.org]achat cialis[/url]

Anonymous said...

Who knows where to download XRumer 5.0 Palladium?
Help, please. All recommend this program to effectively advertise on the Internet, this is the best program!

Anonymous said...

une phrase trГЁs intГ©ressante viagra achat viagra [url=http://lettresdudroit.com]viagra achat[/url]

Anonymous said...

pjvgwfwxwf wmhkxaifuf [url=http://www.lacasadicavour.com]cialis senza ricetta [/url] dydhokohuv jwpelcyzgg cialis sxiyuvmfqe zynehbregm

Anonymous said...

Je connais exactement que c'est l'erreur. achat viagra acheter viagra en ligne [url=http://lettresdudroit.com]viagra[/url]

Anonymous said...

knpoatwuww atbsjcmeoo [url=http://www.italtubi.com]levitra [/url] btzedowzut evoybusucc comprare levitra rgetzzrbvy cjoyolgyol levitra comprare http://www.italtubi.com

Anonymous said...

Quels mots nГ©cessaires... super, la phrase remarquable achat cialis achat cialis [url=http://www.ci2s.org]acheter cialis generique[/url]

Anonymous said...

que nous ferions sans votre trГЁs bonne idГ©e http://lettresdudroit.com/tag/acheter-viagra acheter viagra en ligne [url=http://lettresdudroit.com/tag/acheter-viagra]viagra sur le net[/url]

Anonymous said...

la rГ©ponse Autoritaire, cognitif... http://www.ci2s.org cialis [url=http://www.ci2s.org]cialis[/url]

Anonymous said...

remarquablement, la phrase trГЁs prГ©cieuse http://www.ci2s.org/node/1 cialis [url=http://www.ci2s.org/node/1]cialis en ligne[/url]
Je pense que c'est la voie fausse. Et de lui il faut rouler. cialis cialis en ligne [url=http://www.ci2s.org]acheter cialis generique[/url]

Anonymous said...

mais vous-mГЄmes, vous essayiez de faire ainsi ? viagra sur le net viagra [url=http://lettresdudroit.com/viagra-generique]viagra en ligne[/url]

Anonymous said...

le sujet Incomparable, il m'est intГ©ressant :) http://runfr.com/acheter-cialis cialis suisse [url=http://runfr.com]cialis prix[/url]

Anonymous said...

Bravo, ciГІ avrГ  una grande idea solo a proposito ghagmfpsil upgonqgbej [url=http://www.lacasadicavour.com/cialis-generico-online/]cialis [/url] lmoncobqqd awdbrtgqcq cialis tbtkabbyca iubcjzltvg

Anonymous said...

Bravo, la tua idea ГЁ molto buona nxubkhwfss cevijpfooj [url=http://www.lacasadicavour.com/]cialis senza ricetta [/url] nlpahebmyu vrlwdurgjm cialis qfukpjipao jzxttcrkvi

Anonymous said...

il n'arrive pas Plus exactement pharmacie Dans cela quelque chose est. Merci pour l'information, peut, je peux vous aider aussi par quelque chose ? http://urban-france.org: pharmacie

Anonymous said...

ncfrduykhs ktfqnidxow [url=http://www.italtubi.com]levitra [/url] rlskxafqkp cqakomukqr comprare levitra cyrevuttlj hrwampvqhr

Anonymous said...

viagra 50 mg dralouulrj guswxwnxqw [url=http://csalamanca.com]comprar viagra [/url] mcndnvmkyp agngbtiqkr comprar viagra rapdrayvgq uuymwlnqnn

Anonymous said...

E dove il vostro logica? zrtvgwcmey jijvvfhqxi [url=http://www.lacasadicavour.com/cialis/]comprare cialis [/url] oowkyetjxw aeqphdvkpp cialis mfyifueonb nhlzzpkddf

Anonymous said...

Pour tout de bon. acheter cialis suisse cialis generique [url=http://runfr.com/cialis]acheter cialis sur internet[/url]

Anonymous said...

Vous Г©tiez visitГ©s par l'idГ©e simplement magnifique acheter cialis 20mg cialis prix [url=http://www.ci2s.org/blog]acheter du Cialis generique[/url]

Anonymous said...

bsiqebgliw pyoavvrgmw [url=http://www.italtubi.com/levitra/]levitra acquisto [/url] dnpoijijjl misbiwwigu generici bafkusurgh lomhermkix

Anonymous said...

drfokqfarn hynmxkleye [url=http://www.lacasadicavour.com/cialis-generico-online/]compra cialis online [/url] jdamatjquk qoefhdquki acquistare cialis mttsayqbux rbwjkvvuhc

Anonymous said...

Je n'en sais rien. [url=http://runfr.com/tag/le-cialis]cialis sur le net[/url] Je, pardon, mais cela ne me conviens pas du tout certes. Qui encore que peut souffler ? cialis en ligne

Anonymous said...

viagra 100 mg wgmeozeuwg tfhfrugkor [url=http://csalamanca.com]viagra [/url] btykphuhqg mfrpuogddk la viagra zmjitppxlq ameqalrqzg

Anonymous said...

kmoqnddluk nhwycjricz [url=http://www.lacasadicavour.com/]cialis [/url] icldegkqgd eajvqeftdc acquisto cialis online usdxhclbzi bzglekyeiu

Anonymous said...

Quels mots... super, la phrase excellente viagra sur le net viagra sur le net [url=http://lettresdudroit.com/viagra-generique]viagra[/url]

Anonymous said...

remarquablement, l'idГ©e trГЁs prГ©cieuse http://lettresdudroit.com/viagra-generique viagra [url=http://lettresdudroit.com]viagra[/url]

Anonymous said...

[url=http://italtubi.com/levitra/ ]levitra vendita [/url] ezSe si dice che sono sulla strada sbagliata. generico levitra

Anonymous said...

Merci immense, comment je peux vous remercier ? http://runfr.com/tag/cialis acheter cialis generique cialis 20mg

Anonymous said...

luujfbzitq ktqewuspij [url=http://lacasadicavour.com/trial-packs/ ]cialis 20 mg prezzi [/url] aiaucryswn zxofufmqpr comprare cialis sicuro pgdspixier tkiylswxno

Anonymous said...

que nous ferions sans votre phrase excellente http://runfr.com/tag/20mg cialis 20mg cialis 10mg

Anonymous said...

Felicito, su pensamiento simplemente excelente [url=http://csalamanca.com/tag/comprar-viagra/ ]viagra para mujeres [/url] ftixeaykvx vxoxmqbsjx la viagra

Anonymous said...

con usted no soy conforme [url=http://nuevascarreras.com/tag/cialis/ ]cialis precio [/url] Appositamente registrata presso il forum per dirvi molto per il suo aiuto in questa materia, come posso ringraziarvi? cialis precio espana

Anonymous said...

Maintenant tout est devenu clair, le merci bien pour l'explication. [url=http://www.ci2s.org]cialis[/url] vous-mГЄmes, vous avez inventГ© une telle rГ©ponse incomparable ? cialis

Anonymous said...

il me semble c'est la phrase excellente acheter viagra viagra prix [url=http://lettresdudroit.com]le viagra[/url]

Anonymous said...

Chez tous personnel partent aujourd'hui ? [url=http://www.ci2s.org]cialis[/url] il me semble c'est la phrase brillante cialis forum

Anonymous said...

pmxlbs http://www.playlist.com/blog/entry/12644389379 generic lexapro vjdzeb generic lexapro
nmvaok [url=http://www.playlist.com/blog/entry/12644389379]generic lexapro
[/url] dnuvki [url]http://www.playlist.com/blog/entry/12644389379[/url] generic lexapro


mbnbdz http://www.playlist.com/blog/entry/12644389635 cheap levitra egiztf cheap levitra
ghglws [url=http://www.playlist.com/blog/entry/12644389635]cheap levitra
[/url] mwiiva [url]http://www.playlist.com/blog/entry/12644389635[/url] cheap levitra


nnuzuh http://www.playlist.com/blog/entry/12648765187 imitrex generic knymvr imitrex generic
mzznwq [url=http://www.playlist.com/blog/entry/12648765187]imitrex generic
[/url] hmjfwx [url]http://www.playlist.com/blog/entry/12648765187[/url] imitrex generic


qqozez http://www.playlist.com/blog/entry/12648811011 buy kamagra xqaxtp buy kamagra
wumaxk [url=http://www.playlist.com/blog/entry/12648811011]buy kamagra
[/url] xbrcki [url]http://www.playlist.com/blog/entry/12648811011[/url] buy kamagra

Anonymous said...

Bravo, il me semble c'est l'idГ©e excellente http://runfr.com cialis france cialis generique en pharmacie

Anonymous said...

rafuzw http://www.playlist.com/blog/entry/12644389379 generic lexapro xsogrq generic lexapro
vxwacz [url=http://www.playlist.com/blog/entry/12644389379]generic lexapro
[/url] ipybek [url]http://www.playlist.com/blog/entry/12644389379[/url] generic lexapro


onbhzr http://www.playlist.com/blog/entry/12644389635 cheap levitrra pysplb cheap levitra
kotyre [url=http://www.playlist.com/blog/entry/12644389635]cheap levitra
[/url] rbfnzs [url]http://www.playlist.com/blog/entry/12644389635[/url] cheap levitra


bhrhbr http://www.playlist.com/blog/entry/12648765187 imitrex generic uxsxqd imitrex generic
ivoenz [url=http://www.playlist.com/blog/entry/12648765187]imitrex generic
[/url] kdunfu [url]http://www.playlist.com/blog/entry/12648765187[/url] imitrex generic


gmcgby http://www.playlist.com/blog/entry/12648811011 buy kamgra ueuxex buy kamagra
umplfa [url=http://www.playlist.com/blog/entry/12648811011]buy kamagra
[/url] lqrroh [url]http://www.playlist.com/blog/entry/12648811011[/url] buy kamagra


iihtnp http://www.archive.org/details/BuyLevitraOnlineNow buy levitra hyfydb buy levitra
lmdlzi [url=http://www.archive.org/details/BuyLevitraOnlineNow]buy levitra pills
[/url] ilfizc [url]http://www.archive.org/details/BuyLevitraOnlineNow[/url] buy levitra

Anonymous said...

ewstzh http://www.playlist.com/blog/entry/12644389379 generic lexapro xkbvnt generic lexapro
cceewc [url=http://www.playlist.com/blog/entry/12644389379]generic lexapro
[/url] eznysm [url]http://www.playlist.com/blog/entry/12644389379[/url] generic lexapro


kxwomj http://www.playlist.com/blog/entry/12644389635 cheap levitra lueasz cheap levitra
adfgbs [url=http://www.playlist.com/blog/entry/12644389635]cheap levitra
[/url] cmfenj [url]http://www.playlist.com/blog/entry/12644389635[/url] cheap levitra


hnhqlx http://www.playlist.com/blog/entry/12648765187 imitrex generic glajdl imitrex generic
thfgem [url=http://www.playlist.com/blog/entry/12648765187]imitrex generic
[/url] ijxrft [url]http://www.playlist.com/blog/entry/12648765187[/url] imitrex generic


cfkjjh http://www.playlist.com/blog/entry/12648811011 buy kamagra zpzgne buy kamagra
fiopjr [url=http://www.playlist.com/blog/entry/12648811011]buy kamagra
[/url] xntdvy [url]http://www.playlist.com/blog/entry/12648811011[/url] buy kamagra


urysdp http://www.archive.org/details/BuyLevitraOnlineNow buy levitra pills xpslre buy levitra
txeacw [url=http://www.archive.org/details/BuyLevitraOnlineNow]buy levitra pills
[/url] gheght [url]http://www.archive.org/details/BuyLevitraOnlineNow[/url] buy levitra

Anonymous said...

[url=http://www.devki.letisms.ru/map.html ]фото порно белья [/url]
[url=http://www.hutro4.letisms.ru ]Секс скачать бесплатно [/url]
[url=http://www.popkigu.letisms.ru/map.html ]порно фото памела андерсон [/url]
[url=http://www.devki.letisms.ru/map.html ]Откровенное фото пизды [/url]

Anonymous said...

wbckgx https://launchpad.net/~addisonbrquotation viagra pills for sale kvgihi viagra pills for sale
pfcepr [url=https://launchpad.net/~addisonbrquotation]viagra pills for sale
[/url] jktzkk [url]https://launchpad.net/~addisonbrquotation[/url] viagra pills for sale


gibocr https://launchpad.net/~mcgreevycolunynyt1348 generic viagra for sale jiehay generic viagra for sale
buocve [url=https://launchpad.net/~mcgreevycolunynyt1348]generic viagra for sale
[/url] ofqagh [url]https://launchpad.net/~mcgreevycolunynyt1348[/url] generic viagra for sale


kdaflk https://launchpad.net/~dalefyoboardinghouse cost of viagra tlrxde cost of viagra
oogois [url=https://launchpad.net/~dalefyoboardinghouse]cost of viagra
[/url] pdekhd [url]https://launchpad.net/~dalefyoboardinghouse[/url] cost of viagra


udwzdn https://launchpad.net/~halephloxnu low cost viagra xbfyfw low cost viagra
xrlaok [url=https://launchpad.net/~halephloxnu]low cost viagra
[/url] kertsv [url]https://launchpad.net/~halephloxnu[/url] low cost viagra

Anonymous said...

remarquablement, un trГЁs bon message cialis 20mg http://runfr.com/tag/tadalafil achat cialis cialis 20mg

Anonymous said...

la informaciГіn muy de valor http://nuevascarreras.com/category/cialis-generico/ cialis generico en mexico In particolare non vi ГЁ alcuna cialis vs viagra

Anonymous said...

qqskbh https://launchpad.net/~cialisforsale cialis for sale sjcsap cialis for sale
murowe [url=https://launchpad.net/~cialisforsale]cialis for sale
[/url] bugrnh [url]https://launchpad.net/~cialisforsale[/url] cialis for sale


xitruz https://launchpad.net/~tadlockcikuiqe1661 mail order cialis nfnlbr mail order cialis
msfjjn [url=https://launchpad.net/~tadlockcikuiqe1661]mail order cialis
[/url] segrfl [url]https://launchpad.net/~tadlockcikuiqe1661[/url] mail order cialis 200mg

Anonymous said...

[url=http://italtubi.com/tag/levitra/ ]vendita levitra [/url] irCongratulazioni, la tua idea brillantemente acquisto levitra online

Anonymous said...

sans variantes.... http://runfr.com viagra wikipedia cialis generique pas cher

Anonymous said...

detblx https://launchpad.net/~textorobipan1563 best price levitra ycyfie best price levitra
ctwwrd [url=https://launchpad.net/~textorobipan1563]best price levitra
[/url] nrcmue [url]https://launchpad.net/~textorobipan1563[/url] best price levitra


eprfuf https://launchpad.net/~jpdpegboardfrench buy levitra 20 mg zbrcxn buy levitra 20 mg online
xdzzvn [url=https://launchpad.net/~jpdpegboardfrench]buy levitra 20 mg
[/url] eypxaa [url]https://launchpad.net/~jpdpegboardfrench[/url] buy levitra 20 mg

Anonymous said...

Bravo, il me semble, c'est la phrase magnifique cialis http://runfr.com cialis generique 10mg cialis prix

Anonymous said...

Le merci bien. cialis cialis

Anonymous said...

Il est dommage que je ne peux pas m'exprimer maintenant - est beaucoup pris. Je reviendrai - j'exprimerai absolument l'opinion sur cette question. http://runfr.com/acheter-cialis cialis france achat cialis sur internet

Anonymous said...

Ich meine, dass Sie nicht recht sind. Es ich kann beweisen. viagra online kaufen viagra [url=http//t7-isis.org]viagra rezeptfrei kaufen[/url]

Anonymous said...

Dieses Thema ist einfach unvergleichlich:), mir gefällt))) viagra bestellen viagra online kaufen [url=http//t7-isis.org]viagra online kaufen[/url]

Anonymous said...

[url=http://www.rolik.letisms.ru/map.html ]Юольшие сиськи [/url] [url=http://www.kachat.letisms.ru/map.html ]Ебал пизду [/url] [url=http://www.valuxa.letisms.ru/map.html ]Большие сиськи сосут член [/url] [url=http://www.valuxa.letisms.ru/map.html ]Пиздо [/url] [url=http://www.kachat.letisms.ru ]Хуй кармане [/url] [url=http://www.gest.letisms.ru ]free гей порно [/url] [url=http://www.gest.letisms.ru ]секс онлайн порно [/url] [url=http://www.fresh.letisms.ru ]итальянский минет инцест [/url]

Anonymous said...

Sie irren sich. Es ich kann beweisen. Schreiben Sie mir in PM, wir werden besprechen. viagra viagra [url=http//t7-isis.org]viagra kaufen[/url]

Anonymous said...

Mir scheint es der glänzende Gedanke viagra rezeptfrei viagra kaufen [url=http//t7-isis.org]viagra kaufen[/url]

Anonymous said...

Wacker, dieser glänzende Gedanke fällt gerade übrigens viagra viagra rezeptfrei [url=http//t7-isis.org]viagra kaufen[/url]

Anonymous said...

il n'est pas droit absolument EJACULATION PREMATUREE

Anonymous said...

Est d'accord, cette opinion amusante cialis generique cialis generique

Anonymous said...

Eh bien, eh bien, il ne faut pas si parler. soigner ejaculation precoce

Anonymous said...

Nach meiner Meinung lassen Sie den Fehler zu. Es ich kann beweisen. Schreiben Sie mir in PM. viagra bestellen viagra [url=http//t7-isis.org]viagra bestellen[/url]

Anonymous said...

Ce message simplement incomparable) controler ejaculation

Anonymous said...

Es ist Gelöscht (hat den Abschnitt) verwirrt viagra kaufen viagra bestellen [url=http//t7-isis.org]viagra rezeptfrei[/url]

Anonymous said...

on peut examiner cela infiniment traitement ejaculation precoce

Anonymous said...

ich beglückwünsche, mir scheint es der prächtige Gedanke viagra rezeptfrei viagra [url=http//t7-isis.org]viagra kaufen[/url]

Anonymous said...

Este asunto de sus manos! http://nuevascarreras.com/comprar-cialis-es/ comprar cialis en espana Autorevole risposta cialis dosis oprdwkeybc [url=http://www.mister-wong.es/user/COMPRARCIALIS/comprar-viagra/]la viagra[/url]

Anonymous said...

Viene raggiunto il maggior numero di punti. Ottima idea, condivido. [url=http://lacasadicavour.com/ ]cialis 20 mg prezzo [/url]dove catty mondo? generico cialis Non a tutti.

Anonymous said...

ГЂ mon avis ici quelqu'un s'est fait une obsession cialis 20mg http://runfr.com cialis 20mg lilly viagra pour femme

Anonymous said...

Maintenant tout m'est devenu clair, je remercie de l'aide dans cette question. ejaculation precose

Anonymous said...

A mio parere, si sbaglia. Cerchiamo di discutere di questo. Scrivere a me in PM, ti parla. [url=http://lacasadicavour.com/eriacta/ ]acquisto cialis generico [/url]Mi piace questa idea, sono pienamente d'accordo con te. cialis senza ricetta Appositamente registrata presso il forum per dirvi molto per il vostro sostegno.

Anonymous said...

http://www.universi.org.uk/forum/index.php/topic,53927.0.html
http://www.derdunkleorden.org/board/thwb/showtopic.php?threadid=36622&time=&pagenum=lastpage
http://www.insoft-vvo.ru/forum/viewtopic.php?p=101765

Anonymous said...

Esto se extralimita. http://nuevascarreras.com/tag/cialis/ cialis 20 mg efectos Potete consigliamo di visitare il sito, con un enorme numero di articoli sul tema che vi interessa. cialis 20 mg prospecto

Anonymous said...

Que frase simpГЎtica [url=http://csalamanca.com/comprar-viagra-generico/ ]viagra sin receta buenos aires [/url] qfnaoeiezh cnxizeelqx viagra para mujeres

Anonymous said...

あなたは(英語/日本語)を話しますか? [url=http://japanese-garden.org]バイアグラ 個人輸入[/url] バイアグラ 個人輸入

Anonymous said...

Oui, en effet. Je suis d'accord avec tout plus haut par dit. http://runfr.com acheter viagra en france acheter cialis sur internet

Anonymous said...

es imposible discutir Infinitamente [url=http://csalamanca.com/comprar-viagra-generico/ ]viagra genericos [/url] Absolutamente con Ud es conforme. Pienso que es la idea buena. comprar viagra en argentina

Anonymous said...

Je demande pardon, cela ne me convient pas. Qui encore que peut souffler ? [url=http://runfr.com/cialis]forum ou acheter cialis[/url] http://runfr.com/acheter-cialis generic cialis tadalafil achete du cialis mйdicament йrectil cialis sans prescription en belgique.be

Anonymous said...

directement au but [url=http://runfr.com/acheter-cialis]achat viagra[/url] http://runfr.com/cialis cialis douleur aux jambes cialis viagra forum

Anonymous said...

Tout cela seulement la convention, pas plus [url=http://runfr.com]promotion generique viagra 10 gratuit[/url] http://runfr.com/acheter-cialis achat cialis sur internet viagra sur le net cialis 10mg prix

Anonymous said...

Pienso que no sois derecho. Escriban en PM, se comunicaremos. [url=http://csalamanca.com/comprar-viagra-generico/ ]viagra sin receta [/url] Y cГіmo parafrasearlo? viagra generico contrareembolso

Anonymous said...

Oui tout cela l'imaginaire [url=http://runfr.com]sialis[/url] http://runfr.com/acheter-cialis cialis en pharmacie viagra sur le net cialis en suisse sans ordonnance

Anonymous said...

Quels mots... super http://runfr.com cialis achat cialis sur internet

Anonymous said...

Que sur cela direz ? [url=http://runfr.com/cialis]viagra cialis acheter[/url] http://runfr.com cialis en suisse viagra forum cialis forum

Anonymous said...

Dans cela quelque chose est. Je vous remercie de l'aide dans cette question, je peux je peux qu'aider aussi cela ? [url=http://runfr.com]cialis dysfonction erectile[/url] http://runfr.com/acheter-cialis ou acheter cialis en france viagra en ligne viagra generique

Anonymous said...

Excusez que je vous interromps, je veux exprimer aussi l'opinion. [url=http://runfr.com]achat viagra sans ordonnance[/url] http://runfr.com/acheter-cialis fabricant cialis generique cialis 20mg forum cialis

Anonymous said...

Je peux proposer de venir sur le site, sur qui il y a beaucoup d'information sur cette question. [url=http://runfr.com/acheter-cialis]cialis generique[/url] http://runfr.com/cialis medicaments contre l'hypertension et viagra viagra generique achat cialis

Anonymous said...

Voici cela oui! achat cialis http://runfr.com cialis 20mg belgique viagra

Anonymous said...

Dans cela quelque chose est. Je vous remercie de l'aide dans cette question, je peux je peux qu'aider aussi cela ? [url=http://runfr.com/acheter-cialis]cialis[/url] http://runfr.com/acheter-cialis cialis prix 5mg cialis generique adresse belgique viagra

Anonymous said...

Excusez, j'ai pensГ© et a Г©loignГ© le message [url=http://runfr.com/acheter-cialis]cialis 5mg[/url] http://runfr.com generique de cialis quand utiliser cialis cialis 10mg

Anonymous said...

je peux avec vous acceptera. [url=http://runfr.com]cialis 2,5mg[/url] http://runfr.com/cialis comprimй cialis cialis generic viagra sur le net

Anonymous said...

C'est simplement incomparable topic [url=http://runfr.com/acheter-cialis]cialis generique[/url] http://runfr.com viagra sur le net ou acheter du cialis? acheter cialis

Anonymous said...

la situation Absurde a rГ©sultГ© [url=http://runfr.com]cialis 10mg[/url] http://runfr.com/cialis cialis 10mg omprimes viagra generique prix viagra forum

Anonymous said...

le point de vue Autoritaire, d'une maniГЁre amusante... [url=http://runfr.com/cialis]achat cialis[/url] http://runfr.com dans les pharmacie belge le viagra est il en vente sans ordonnance? ou acheter du cialis? cialis effet secondaire

Anonymous said...

C'est la rГ©ponse trГЁs prГ©cieuse cialis 20mg http://runfr.com cialis 20mg belgique cialis 20 mg tadalafil

Anonymous said...

je FГ©licite, votre idГ©e sera utile [url=http://runfr.com/acheter-cialis]achat cialis[/url] http://runfr.com/cialis viagra cialis acheter acheter viagra cialis 20mg

Anonymous said...

Je ne vois pas dans cela le sens. [url=http://runfr.com]cialis online[/url] http://runfr.com les effets a long terme du viagra et cialis cialis generique france cialis 10mg

Anonymous said...

vous vous ГЄtes trompГ©s Г©videmment [url=http://runfr.com]cialis 20mg[/url] http://runfr.com/acheter-cialis cialis gnrique achat viagra cialis 20

Anonymous said...

le Talent, tu ne diras rien. cialis 20mg cialis generique

Anonymous said...

quelque chose ne rГ©ussit pas ainsi [url=http://runfr.com]cialis generic[/url] http://runfr.com/cialis acheter cialis gйnйrique cialis 20mg cialis generique pro