使用WSE,可以自定义SoapHeader信息.
http://download.microsoft.com/download/5/5/1/5511bfc6-e52f-4db0-bafb-fd5dcb91eff0/Microsoft%20WSE%203.0.msi
2。安装时选择VS.net Developer安装模式,这样它会在VS.net2005安装插件,方便使用
3。安装MS SoapToolkit 3.0,这样可以方便的Trace到Soap信息(其机理是Client --> Trace Utility--> Server)
http://download.microsoft.com/download/2/e/0/2e068a11-9ef7-45f5-820f-89573d7c4939/soapsdk.exe
安装之后启动Trace Utility, 选择new formatted trace. listen local port#:8080 (这个是client调用WebService的端口)
Forward to Destination Host & Port 是实际Server的WebService的地址.
4。在客户端项目启用WSE3.0,如图所示,在WSE Setting 3.0 里面勾上Enable this project for Web Services Enhancements. 这样它就会自动引用Microsoft.Web.Services3.dll 到项目. 然后添加Web Reference. 此时生成的代理类和未启用WSE有区别. 例如对于MathService,在未启用WSE之前,定义如下: public partial class MathService : System.Web.Services.Protocols.SoapHttpClientProtocol 而启用WSE之后, Reference.cs文件里面多了一个类
public partial class MathServiceWse : Microsoft.Web.Services3.WebServicesClientProtocol
要自定义SoapHeader信息,下面就要用到MathServiceWse这个类
5。启用Policy文件. 在WSE Setting 3.0 里面的Policy的Tab勾上Enable Policy,默认文件名是wse3policyCache.config. 点击[Add...],弹出[Add or Modify Policy Friendly Name],随便输入Policy的名字,如clientPolicy. 然后会出来详细的Config界面. 根据我们项目的具体情况,选择"Secure a client application", Choose client authentication method "Username", 输入用户名密码, 去掉Enable WS-Security 1.1 extensions. 点Finish.
我们在代码里增加SetPolicy的调用,就会在SoapHeader里面增加了<wsse:Security>的信息,包含了用户名密码
MathServiceWse svr = new MathServiceWse();
svr.SetPolicy("clientPolicy");
svr.Add(1,2);
6。但是第5步生成的Soapheader和Server端要求的信息还是有差别,导致调用不成功. 这个时候我们就要通过SoapFilter 自定义Soap 信息. 新建一个ClassLibrary项目.编译成dll.
部分关键代码如下(不完整):
{
public class RemoveAddressingHeadersAssertion : PolicyAssertion
{
public override SoapFilter CreateClientOutputFilter(FilterCreationContext context)
{
return new ClientOutputFilter();
}
}
public class ClientOutputFilter : SoapFilter
{
public override SoapFilterResult ProcessMessage(SoapEnvelope envelope)
{
//示例代码,请根据实际情况修改
XmlNode actionNode = envelope.Header["XXXXXX"];
envelope.Header.RemoveChild(actionNode);
XmlNode AppParamNode = envelope.CreateNode(XmlNodeType.Element, "ExtraParameters", "namespace");
envelope.Header.AppendChild(AppParamNode);
return SoapFilterResult.Continue;
}
}
}
7。在client Project引用RemoveAddressingHeadersAssertion.dll, 并修改wse3policyCache.config修改添加内容

<extensions>
<extension name="usernameOverTransportSecurity" type="Microsoft.Web.Services3.Design.UsernameOverTransportAssertion, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<extension name="username" type="Microsoft.Web.Services3.Design.UsernameTokenProvider, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<extension name="requireActionHeader" type="Microsoft.Web.Services3.Design.RequireActionHeaderAssertion, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<extension name="RemoveAddressingHeadersAssertion" type="WSE3.CustomAssertion.RemoveAddressingHeaders.RemoveAddressingHeadersAssertion,RemoveAddressingHeadersAssertion"/>
</extensions>
<policy name="clientPolicy">
<usernameOverTransportSecurity>
<clientToken>
<username username="MyUserName" password="MyPassword" />
</clientToken>
</usernameOverTransportSecurity>
<requireActionHeader />
<RemoveAddressingHeadersAssertion />
</policy>
</policies>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?