当前位置: 首页 > 编程语言 > C#

使用SOAP请求中的自定义字段实现WSSE安全标头时出现C#运行时错误分享

时间:2023-04-10 19:40:28 C#

C#学习教程:在SOAP请求中使用自定义字段实现WSSE安全标头时出现C#运行时错误使用WSSE和UsernameToken进行身份验证。示例查询如下(屏蔽机密数据):abc12312345678901我使用WSE3.0生成了一个代理类,问题是我收到错误:“对象引用未设置为对象的实例。”我的C#代码中有问题的部分如下:queryNoSorguTypeq=newqueryNoSorguType();字符串query_parameter=query_no;q.queryNo=query_parameter;结果类型[]r=新的结果类型[10];UsernameTokentoken=newUsernameToken("abc","123",PasswordOption.SendPlainText);//mWebService.SetClientCredential(token);//策略webServiceClientPolicy=newPolicy();mWebService.RequestSoapContext.Security.Tokens.Add(令牌);//mWebService.SetPolicy(webServiceClientPolicy);//r=mWebService.documentQuerybyQueryNo(q);System.Data.DataTableoutputDataTable=newSystem.Data.DataTable();//System.Data.DataRowoutRow=outputDataTable.Rows.Add();//outRow["field1"]=r;输出=输出数据表;我通过系统地注释掉部分代码找到了有问题的部分。我对Web服务、C#很陌生,实际上我正在BluePrism中实现它。虽然这个程序可以与SOAPWeb服务一起使用,但遗憾的是它本身并不支持SOAP标头。SOAP请求在SOAPUI中运行良好,在BluePrism中没有编译器错误。我尝试按照手册和网络上的说明添加标头,但它不起作用。如果您能指出正确的方向,我将不胜感激。编辑编写后,在VisualStudio2017中编译控制台应用程序时出现以下错误。据我所知,它没有定义标头。未处理的异常:System.Web.Services.Protocols.SoapHeaderException:MustUnderstand标头:[{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}安全]在System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage消息,WebResponse响应,StreamresponseStream,BooleanasyncCall)在System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String)在WebService.queryByQueryNo(queryNoQueryTypequeryByQueryNo1)在C:UsersusersourcereposConsoleApp1ConsoleApp1WebReferencesWebServiceReferencesWebServiceReference.cs:C:UsersusersourcereposConsoleApp1ConsoleApp1Program.cs中ConsoleApp1.Program.Main(String[]args)的第1533行:C:UsersApp1.Program.Main(String[]args)在C:UsersApp1.Program.Main(String[]args)中的第33行.cs:line33Thexmlstructurewsseisnotdefined,Iknowyoudefineitinthesameline但你为什么不试着把它放在文档上,像这样的abc123我决定使用不同的方法并尝试过现在使用代理类,因为存在相关问题。利用此链接上的答案:ClientsendsSOAPrequestandreceivesresponse经过一些定制后我想出了自己的解决方案。但是,我仍然想知道如何使用VisualStudio或WSE3.0定义的包装器类使其工作。在VisualStudio中编写并测试代码后,很容易将其移植到BluePrism。以上是C#学习教程:在SOAP请求中使用自定义字段实现WSSE安全头时出现C#运行时错误。分享的全部内容,如果对大家有用,需要进一步了解C#学习教程,希望大家多多分享关注---usingSystem;使用System.Collections.Generic;使用系统数据;使用系统文本;使用System.Threading.Tasks;使用System.Xml;使用System.Net;使用System.IO;使用System.Xml.Linq;namespaceWebService{classProgram{//////执行SoapWebService调用///publicstaticstringExecute(stringqueryNo){HttpWebRequestrequest=CreateWebRequest();XmlDocumentsoapEnvelopeXml=newXmlDocument();soapEnvelopeXml.LoadXml(@"USERCODE"+queryNo+@"");使用(Streamstream=request.GetRequestStream()){soapEnvelopeXml。保存(流);}使用(WebResponseresponse=request.GetResponse()){使用(StreamReaderrd=newStreamReader(response.GetResponseStream())){stringsoapResult=rd.ReadToEnd();控制台.WriteLine(soapResult);返回肥皂结果;}}}//////创建一个soapwebrequest到[Url]/////publicstaticHttpWebRequestCreateWebRequest(){HttpWebRequestwebRequest=(HttpWebRequest)WebRequest.Create(@"https://webservice.com/webservice?wsdl");webRequest.Headers.Add(@"SOAP:Action");webRequest.ContentType="text/xml;charset="utf-8"";webRequest.Accept="文本/xml";webRequest.Method="POST";返回网络请求;}staticvoidMain(string[]args){if(args.Length==0||args.Length>1){System.Console.WriteLine("请提供查询编号");System.Console.WriteLine("Usage:WebService.exe3523423333");返回;}字符串输出,XMLresponse;尝试{XMLresponse=Execute(args[0]);output="查询成功";XmlDocumentxml=newXmlDocument();xml.LoadXml(XMLresponse);//假设str字符串包含XML数据。您也可以从文件加载XML数据。XmlNodeListresultCodeList=xml.GetElementsByTagName("resultCode");XmlNodeListresultNoList=xml.GetElementsByTagName("resultNo");诠释我=0;varOutputTable=newDataTable();输出表.Columns.Add("结果码",typeof(string));OutputTable.Columns.Add("结果编号",typeof(string));foreach(XmlNodexninresultCodeList){Console.WriteLine(resultCodeList[i].InnerText+""+resultNoList[i].InnerText);OutputTable.Rows.Add(resultCodeList[i].InnerText,resultNoList[i].InnerText);我++;}}catch(System.Net.WebExceptionexc){Console.WriteLine("HTTPPOST请求失败!");output="!!!HTTPPOST请求失败!!!";}}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: