对于如何创建SOAP 标头毫不犹豫

我几乎没有使用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期间复制流并在BeforeDeserialize期间添加标头。

添加标题是将“新”流(从ChainStream返回)的内容读入XML文档(在我的情况下为XDocument ),添加标题,然后将其写入传递给ChainStream的原始流的情况。

不幸的是,这是非常脏的,你不能(据我所知)在需要时使用具有适当身份validation信息的新实例。

我已经大部分使用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库 ,它提供了比上面的简单示例更多的function。 如果您需要在SOAP标头中使用Kerberos令牌或证书签名,那么就可以了。 如果您需要为通过SSL运行的Web服务添加简单的用户名和密码,那么您可能只需要这样的例子。

编辑: WSE上的快速模糊这十年早些时候,当Web服务将接管世界时,许多行业参与者(微软,IBM,Sun等)聚集在一起,提出了对其进行操作的标准方法。 形成的身体是OASIS 。 从那时起,微软已经发布了其WSE库的许多版本以支持一些规范,但有趣的是,即使第一个版本在2003年左右公开,它们也从未被整合到.Net框架中。

Web服务虽然仍然非常受欢迎,但在我看来,在不同的互联网应用程序之间进行集成的一种很好的方式已经有点失宠了。 其中一个原因无疑是因为AJAX和网络服务不是最好的床位研究员,尽管这已经有所改善。 一旦你开始包含所有额外的sWSE规范,并且其中一个瘦的Web服务被解决,其他RPC协议,CORBA等的复杂性,Web服务也会变得相当复杂。与此同时,REST已经获得了很多人气Web服务和AJAX库通常更喜欢它。

Web服务不会很快消失,但它们很可能不会很快接管世界。

有一个名为ClearUserNameBinding的开源自定义Binding,这个绑定有助于在Http上将UserNameToken作为clearText传递。 当使用WCF cllient需要使用基于java的Web服务时,这帮助了我。

http://code.google.com/p/wcf-clear-username-binding/ http://webservices20.blogspot.com/2008/11/introducing-wcf-clearusernamebinding.html