new CodeGeneratorOptions()); // Compile the assembly with t

时间:2022-04-13 09:03:26

经常遇到C#挪用webservice的情况,凡是来说如果webservice是用vs+c#来开发的,问题一般来说不大,直接web引用,然后挪用就OK了。流程如下:

new CodeGeneratorOptions()); // Compile the assembly with t

new CodeGeneratorOptions()); // Compile the assembly with t

new CodeGeneratorOptions()); // Compile the assembly with t

new CodeGeneratorOptions()); // Compile the assembly with t

下面就是进行挪用,就这么简单。

new CodeGeneratorOptions()); // Compile the assembly with t

但如果webservice是用JAVA或者其它语言或者其它工具生成的话,使用vs+c#来挪用就经常遇到问题;就是使用上面的要领显得很欠好使,经常是使用SOAP UI挪用没有问题,但使用上面的要领却挪用报错,经常是500的错误。当你联系webservice供给商时凡是会说SOAP UI都能挪用得到,你们用代码为啥子挪用不到,,问题出在你们的挪用要领上。

在我们向其它公司供给webservice的时候,经常也会呈现这样的问题,以前我们一直都以为SOAP UI能够挪用,那么代码也就必然能够挪用得通,但颠末实践,我们本身写DEMO挪用本身的webservice时才发明,并不是别人的挪用代码写的有问题,因为我们本身也无法将本身写的webservice挪用得通,或者说没有找到正确的要领挪用得通。这时我们就要思考是否是SOAP UI能够挪用得通的webservice就代码必然挪用没有问题呢?或者说SOAP UI挪用webservice和代码挪用webservice的道理区别到底在哪里呢?

总结一下:

(1)SOAP UI能够挪用告成,代码不必然能够挪用告成,代码挪用告成并且得到返回功效的前提是webservice可以按标准返回功效,但SOAP UI是只要按信封返回就可以收到功效而不管功效是否标准;

(2)如果webservice的header有用户名和暗码的校验,使用SOAP UI可以挪用告成并且得到返回功效,但使用上面web引用的方法却不行。对付这种情况,有以下要领可以挪用告成:

反复上面web引用的方法,此外引用Microsoft.Web.Services3(这个DLL可以CSDN上面下载)。

new CodeGeneratorOptions()); // Compile the assembly with t

手工改削Reference.cs

new CodeGeneratorOptions()); // Compile the assembly with t

new CodeGeneratorOptions()); // Compile the assembly with t

以下是挪用要领,重点在传入用户名和暗码,改削担任类的重点也在于此;

new CodeGeneratorOptions()); // Compile the assembly with t

引用完成,挪用就会告成了,功效如下:

new CodeGeneratorOptions()); // Compile the assembly with t

从上面可以看出web引用真的是简单粗暴,根基不用写几句代码就可以搞定绝大部分的webservice挪用。

但是web引用却有在现实开发中常遇到的错误谬误:

(1)需要开发环境可以访谒到的wsdl地点;

(2)如果webservice有变革需要更新web引用;

new CodeGeneratorOptions()); // Compile the assembly with t

那有没有其它要领呢?答案是有的。一种是直接封装信封,使用WebRequest,代码如下:

private void button2_Click(object sender, EventArgs e) { StringBuilder soap = new StringBuilder(); soap.Append("<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:zls=\"www.zlsoft.cn\">"); soap.Append("<soap:Header>"); soap.Append("<wsse:Security soap:mustUnderstand=\"true\" xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\" xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\">"); soap.Append("<wsse:UsernameToken wsu:Id=\"UsernameToken-4\">"); soap.Append("<wsse:Username>hjq</wsse:Username>");//用户名 soap.Append("<wsse:Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText\">123</wsse:Password>");//口令 soap.Append("<wsse:Nonce EncodingType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary\">gC6dDGKjxo0IaRc5KpQU3w==</wsse:Nonce>"); soap.Append("<wsu:Created>2017-11-01T05:11:22.805Z</wsu:Created>"); soap.Append("</wsse:UsernameToken>"); soap.Append("</wsse:Security>"); soap.Append("</soap:Header>"); soap.Append("<soap:Body>"); soap.Append("<zls:getUserInfo>"); soap.Append("<zls:appsys_id>trwetre</zls:appsys_id>"); soap.Append("<zls:appsys_token>sdafdsf</zls:appsys_token>"); soap.Append("<zls:sid>fdsafds</zls:sid>"); soap.Append("</zls:getUserInfo>"); soap.Append("</soap:Body>"); soap.Append("</soap:Envelope>"); string url = ":6998/services/HIPService?wsdl"; var result = GetSOAPReSource(url, soap.ToString()); } public static string GetSOAPReSource(string url, string datastr) { try { //request Uri uri = new Uri(url); WebRequest webRequest = WebRequest.Create(uri); webRequest.ContentType = "application/soap+xml; charset=utf-8"; webRequest.Method = "POST"; using (Stream requestStream = webRequest.GetRequestStream()) { byte[] paramBytes = Encoding.UTF8.GetBytes(datastr.ToString()); requestStream.Write(paramBytes, 0, paramBytes.Length); } //response WebResponse webResponse = webRequest.GetResponse(); using (StreamReader myStreamReader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8)) { string result = ""; return result = myStreamReader.ReadToEnd(); } } catch (Exception ex) { throw ex; } }