WCF是否支持WS-Eventing?
时间:2020-03-06 14:28:37 来源:igfitidea点击:
我知道WCF支持许多WS- *协议,但是WS-Eventing的确列出了。
我确实知道WCF具有发布/订阅模型,但是它是否符合WS-Eventing?
解决方案
我似乎记得以前曾在CodeProject上阅读过有关此内容的文章。
抱歉,我无济于事,但这是Roman Kiss的文章。
WCF 3.0中没有本机发布/订阅模型,但是有一些选择。
罗马之吻文章Ash找到了。
我们可以实现许多其他模式(已在MSDN Mag中介绍)
Juval Lowy有两种框架实现,我们可以在他的网站IDesign上下载
最后,我目前正在用很少的开销来模仿这一点的是MSMQ。
至少使用WCF4,我们可以简单地通过导入WS-Eventing WSDL(带有肥皂绑定)来创建wsdl客户端。它需要双工绑定,因此http-duplex或者简单的tcp都应该起作用。问题是添加了正确的回调。对我们来说,这就是窍门
Subscribe s = new Subscribe(); (s.Delivery = new DeliveryType()).Mode = "http://schemas.xmlsoap.org/ws/2004/08/eventing/DeliveryModes/Push"; XmlDocument doc = new XmlDocument(); using (XmlWriter writer = doc.CreateNavigator().AppendChild()) { EndpointReferenceType notifyTo = new EndpointReferenceType(); (notifyTo.Address = new AttributedURI()).Value = callbackEndpoint.Uri.AbsoluteUri; XmlRootAttribute notifyToElem = new XmlRootAttribute("NotifyTo"); notifyToElem.Namespace = "http://schemas.xmlsoap.org/ws/2004/08/eventing"; XmlDocument doc2 = new XmlDocument(); using (XmlWriter writer2 = doc2.CreateNavigator().AppendChild()) { XmlRootAttribute ReferenceElement = new XmlRootAttribute("ReferenceElement"); foreach(AddressHeader h in callbackEndpoint.Headers) { h.WriteAddressHeader(writer2); } writer2.Close(); notifyTo.ReferenceParameters = new ReferenceParametersType(); notifyTo.ReferenceParameters.Any = notifyTo.ReferenceParameters.Any = doc2.ChildNodes.Cast<XmlElement>().ToArray<XmlElement>(); } new XmlSerializer(notifyTo.GetType(), notifyToElem).Serialize(writer, notifyTo); } (s.Delivery.Any = new XmlElement[1])[0] = doc.DocumentElement; (s.Filter = new FilterType()).Dialect = "http://schemas.xmlsoap.org/ws/2006/02/devprof/Action"; (s.Filter.Any = new System.Xml.XmlNode[1])[0] = new System.Xml.XmlDocument().CreateTextNode("http://www.teco.edu/SensorValues/SensorValuesEventOut"); SubscribeResponse subscription; try { Console.WriteLine("Subscribing to the event..."); //Console.ReadLine(); subscription = eventSource.SubscribeOp(s); }