【问题标题】:Read SOAP header before sending in C#在 C# 中发送之前读取 SOAP 标头
【发布时间】:2014-06-17 07:58:29
【问题描述】:

我使用 wsdl.exe 在 C# 中生成一个类来调用 Web 服务。只要此 Web 服务不需要标头,就可以正常工作。 现在我需要添加这样的标题:

<soapenv:Header>
  <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
     <wsse:UsernameToken>
        <wsse:Username>myUsername</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">myPassword</wsse:Password>
     </wsse:UsernameToken>
  </wsse:Security>

所以我添加了一个Security类,里面有UsernameToken类,里面带有Username和Password,并添加到调用类中。捕获发送出去的整个 SOAP 消息的问题可以通过SOAP extension 解决。我可以实现:

<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    <UsernameToken>
       <Username>username</Username>
       <Password>verysecret</Password>
    </UsernameToken>
</Security>

所以现在我错过了这个wsse 部分和密码标签中的“类型”属性? 如何才能做到这一点?我应该改用[MessageContract] 吗? 或者我可以只是“硬编码”字符串并将其放在标题中吗?

【问题讨论】:

  • 需要header的web服务,是WCF还是普通的web服务?
  • 这个问题真的是关于标题,还是关于在每个身份验证请求中发送用户名和密码?
  • 我会说普通的 Web 服务(EAR 在 WebSphere 上运行)。当然问题最终是发送用户名和密码,但我一步一步来。现在我想看看我要发送什么。
  • @Graffl 如果您只想查看 SOAP 消息以用于学习目的,只需检查您在服务器端收到的原始 SOAP 消息。
  • 如果他可以访问服务器...

标签: c# web-services soap


【解决方案1】:

您的问题中有几个问题,但要回答“尽管如此,我现在最大的问题是,我看不到实际上作为标头发送的内容。”您可以在方法 private void CallWebSvcCallAsync(model.WebSvcMethod webSvcMethod) 中看到 SOAP 信封

var call = new websvcasync.Operations.CallAsyncOp(webSvcMethod, _cancelToken, State.Instance.ConfigProxy, State.Instance.ConfigTimeout.Timeout); 上设置一个断点并检查webSvcMethod.SampleReqMsg。它会让您了解正在张贴的信封。

如果您可以对 SOAP 信封结构进行排序,那么您应该可以开始了。

【讨论】:

  • 但是,我建议您尝试获取一个您知道有效的 SOAP 信封,然后使用 WsdlUI 并进行比较和修改以获得所需的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 2012-05-08
相关资源
最近更新 更多