我正在尝试发送SOAP 请求到使用的网络服务WSSE和 UsernameToken 用于身份验证。示例查询如下(屏蔽机密数据):
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:kas="http://webservice.com">
<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>abc</wsse:Username>
<wsse:CustomField>123</wsse:CustomField>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<kas:method1>
<!--Optional:-->
<method1>
<!--Optional:-->
<queryNo>12345678901</queryNo>
</method1>
</kas:method1>
</soapenv:Body>
</soapenv:Envelope>
我已经使用生成了一个代理类WSE 3.0问题是我收到错误:“对象引用未设置为对象的实例。”我的 C# 代码有问题的部分如下:
queryNoSorguType q = new queryNoSorguType();
string query_parameter = query_no;
q.queryNo = query_parameter;
ResultType[] r = new ResultType[10];
UsernameToken token = new UsernameToken("abc", "123",PasswordOption.SendPlainText);
//mWebService.SetClientCredential<UsernameToken>(token);
//Policy webServiceClientPolicy = new Policy();
mWebService.RequestSoapContext.Security.Tokens.Add(token);
//mWebService.SetPolicy(webServiceClientPolicy);
//r = mWebService.documentQuerybyQueryNo(q);
System.Data.DataTable outputDataTable = new System.Data.DataTable();
//System.Data.DataRow outRow = outputDataTable.Rows.Add();
//outRow["field1"] = r;
output = outputDataTable;
我通过系统地注释掉部分代码来找到有问题的部分。我对 Web 服务、C# 很不熟悉,我实际上是在蓝色棱镜。尽管该程序可以直接使用 SOAP Web 服务,但遗憾的是它本身并不支持 SOAP 标头。
SOAP 请求工作正常SOAP UIBlue Prism 中没有编译器错误。我尝试按照手册和网络上的说明添加标题,但它不起作用。如果您能指出正确的方向,我将不胜感激。
EDIT在 Visual Studio 2017 中编写、编译控制台应用程序后,出现以下错误。据我了解,它没有标题的定义。
Unhandled Exception: System.Web.Services.Protocols.SoapHeaderException: MustUnderstand headers:[{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}Security] are not understood
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at WebService.queryByQueryNo(queryNoQueryType queryByQueryNo1) in C:\Users\user\source\repos\ConsoleApp1\ConsoleApp1\Web References\WebService\Reference.cs:line 1533
at ConsoleApp1.Program.Main(String[] args) in C:\Users\user\source\repos\ConsoleApp1\ConsoleApp1\Program.cs:line 33