我几乎没有使用SOAP协议的经验.我需要连接到所需标头的服务.我认为这在Java中有些标准,但在C#中必须手动创建这个头.
这里有没有人能够连接到类似的服务:已创建标题或甚至可能知道一些标准库,这将简化标题的创建?你能分享一些代码或参考吗?
我还发现了一个线索,如果使用WS2005,可能会生成标头,因为它有WS3插件.有谁评论这个?快速浏览一下这个插件后,我在Security头中找到了simmilar字段,但仍然无法创建标头.
我们能够使用以下代码解决它:
public class SecurityHeader : System.ServiceModel.Channels.MessageHeader { public string userName; public string password; protected override void OnWriteStartHeader (System.Xml.XmlDictionaryWriter writer, System.ServiceModel.Channels.MessageVersion messageVersion) { writer.WriteStartElement("wsse", Name, Namespace); writer.WriteXmlnsAttribute("wsse", Namespace); } protected override void OnWriteHeaderContents (System.Xml.XmlDictionaryWriter writer, System.ServiceModel.Channels.MessageVersion messageVersion) { writer.WriteStartElement("wsse", "UsernameToken", Namespace); writer.WriteStartElement("wsse", "Username", Namespace); writer.WriteValue(userName); writer.WriteEndElement(); writer.WriteStartElement("wsse", "Password", Namespace); writer.WriteValue(password); writer.WriteEndElement(); writer.WriteEndElement(); } public override string Name { get { return "Security"; } } public override string Namespace { get { return "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; } } }
这写了DataPower框所需的标题.
如何使用SecurityHeader类
public static void Main(string[] args) { var webService = new ServiceReference1.MyWebService(); .... webService.Open(); using (OperationContextScope scope = new OperationContextScope((IContextChannel)webService.InnerChannel)) { var myObjRequest = GetMyObjRequest(); MessageHeaders messageHeadersElement = OperationContext.Current.OutgoingMessageHeaders; messageHeadersElement.Add(SecurityHeader("UserName", "Password")) var res = webService.MyServe(myObjRequest); Console.WriteLine(res.ToString()); } }
有趣的你应该提到的是-我一直在做的正是最近.
我设法它用做SoapExtension
它用ChainStream
,以保持原始流的复制,只是复制在流BeforeDeserialize
,并在添加标题AfterSerialize
.
添加标题是将"新"流(返回ChainStream
)的内容读入XML文档(XDocument
在我的例子中),添加标题,然后将其写入传入的原始流中的情况ChainStream
.
不幸的是,这是非常脏的,你不能(据我所知)在需要时使用具有适当身份验证信息的新实例.
我已经大部分使用了SoapHeader
一个方法,为Web服务的每个方法添加一个适当的属性,并且还有一个带有所需头的实例的相应字段/属性 - 但是SOAP序列化目前让我感到头疼.指定正确的元素名称(带名称空间).这是我一直计划在有空的时候问别人的事情.
很抱歉不能给你一个完整的答案 - 并且对于缺乏代码而道歉,它属于公司而不是我 - 但希望它至少会给你一个起点.
通常很容易将SOAP标头添加到.Net中的Web服务代理中.这是一个快速的代码示例.
创建一个新的SOAP标头
using System.Web.Services.Protocols; public class SoapAuthHeader : SoapHeader { public string Username; public string Password; }
在您的Web服务代理类中:
public class MyWebServicesProxy : System.Web.Services.Protocols.SoapHttpClientProtocol { public SoapAuthHeader AuthHeader; ... }
然后使用:
SoapAuthHeader authHeader = new SoapAuthHeader(); authHeader.Username = "username"; authHeader.Password = "password"; MyWebServicesProxy myProxy = new MyWebServicesProxy(); myProxy.AuthHeader = authHeader;
编辑:还有其他方法,微软确实有一个包含WS-Security 的WSE库,它提供了比上面的简单示例更多的功能.如果您需要在SOAP标头中使用Kerberos令牌或证书签名,那么就可以了.如果你需要为通过SSL运行的Web服务添加一个简单的用户名和密码,那么exmaple可能就是你所需要的.
编辑:WSE上的快速模糊这十年早些时候,当Web服务将接管世界时,一群行业参与者(微软,IBM,Sun等)聚集在一起,提出了对它们做事的标准方法.形成的身体是OASIS.从那以后,微软已经发布了许多版本的WSE库来支持一些规范,但有趣的是,即使第一个版本在2003年左右公开,它们也从未被整合到.Net框架中.
Web服务虽然仍然非常受欢迎,但在我看来,在不同的互联网应用程序之间进行集成的一种很好的方式已经有点失宠了.其中一个原因无疑是因为AJAX和网络服务不是最好的床位研究员,尽管这已经有所改善.一旦你开始包含所有额外的sWSE规范,并且其中一个瘦的web服务被解决,其他RPC协议,CORBA等的复杂性,Web服务也会变得相当复杂.与此同时,REST已经获得了很多人气. Web服务和AJAX库通常更喜欢它.
Web服务不会很快消失,但它们很可能不会很快接管世界.