使用SilverLight构建插件式应用程序(八) —聊天插件Duplex WCF的实现
2008-10-23 11:43:33 来源:WEB开发网代码就是直接删除了队列中的用户。
公共函数:发送数据到客户端:
private void SendMessageToClient(ChatMessage chatMessage)
{
if (chatMessage.To != null && chatClients.ContainsKey(chatMessage.To))
{
IWSChatClient chatclient = chatClients[chatMessage.To];
Message returnMessage = Message.CreateMessage(MessageVersion.Soap11, "WindCloud/WSChatService/Receive", chatMessage);
try
{
chatclient.Receive(returnMessage);
}
catch
{
if (chatUsers.Contains(chatMessage.To))
{
chatUsers.Remove(chatMessage.To);
}
if (chatClients.ContainsKey(chatMessage.To))
{
chatClients.Remove(chatMessage.To);
}
}
}
}
如果发送的时候发生异常,就从队列删除。
8:ServerHost的代码,这个从MSDN上抄过来的:
public class ChatHostFactory : ServiceHostFactoryBase
{
public override ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses)
{
return new ChatServiceHost(baseAddresses);
}
}
class ChatServiceHost : ServiceHost
{
public ChatServiceHost(params System.Uri[] addresses)
{
base.InitializeDescription(typeof(WSChatService), new UriSchemeKeyedCollection(addresses));
}
protected override void InitializeRuntime()
{
// Define the binding and set time-outs.
PollingDuplexBindingElement pdbe = new PollingDuplexBindingElement()
{
ServerPollTimeout = TimeSpan.FromSeconds(10),
InactivityTimeout = TimeSpan.FromMinutes(1)
};
// Add an endpoint for the given service contract.
this.AddServiceEndpoint(
typeof(WSChatService),
new CustomBinding(
pdbe,
new TextMessageEncodingBindingElement(
MessageVersion.Soap11,
System.Text.Encoding.UTF8),
new HttpTransportBindingElement()),
"");
base.InitializeRuntime();
}
}
9:svc文件的代码:
<%@ServiceHost language=c# Debug="true" Factory="ChatHostFactory" %>
这个也是从MSDN上抄写过来的。
读写数据库的代码其实可以完全注释掉,这个只是为了有个保存功能。整个代码还有不完善的地方,但是基本可以实现Duplex WCF的从服务器向客户端推数据的功能,保证数据实时,这也是长久也来我想了解的服务器和客户端实时通信的问题的一个解决办法。
Tags:使用 SilverLight 构建
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接