一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - C#調用webservice接口的最新方法教程

C#調用webservice接口的最新方法教程

2022-02-10 15:20上青天攬月 C#

webservice 可以用于分布式應用程序之間的交互,和不同程序之間的交互。下面這篇文章主要給大家介紹了關于C#調用webservice接口的相關資料,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋

前言

web service也叫xml web service webservice是一種可以接收從internet或者intranet上的其它系統中傳遞過來的請求,輕量級的獨立的通訊技術。是:通過soap在web上提供的軟件服務,使用wsdl文件進行說明,并通過uddi進行注冊。

xml:(extensible markup language)擴展型可標記語言。面向短期的臨時數據處理、面向萬維網絡,是soap的基礎。

soap:(simple object access protocol)簡單對象存取協議。是xml web service 的通信協議。當用戶通過uddi找到你的wsdl描述文檔后,他通過可以soap調用你建立的web服務中的一個或多個操作。soap是xml文檔形式的調用方法的規范,它可以支持不同的底層接口,像http(s)或者smtp。

wsdl:(web services description language) wsdl 文件是一個 xml 文檔,用于說明一組 soap 消息以及如何交換這些消息。大多數情況下由軟件自動生成和使用。

uddi (universal description, discovery, and integration) 是一個主要針對web服務供應商和使用者的新項目。在用戶能夠調用web服務之前,必須確定這個服務內包含哪些商務方法,找到被調用的接口定義,還要在服務端來編制軟件,uddi是一種根據描述文檔來引導系統查找相應服務的機制。uddi利用soap消息機制(標準的xml/http)來發布,編輯,瀏覽以及查找注冊信息。它采用xml格式來封裝各種不同類型的數據,并且發送到注冊中心或者由注冊中心來返回需要的數據。

c#調用webservice接口

我們在日常開發中,經常遇到c#調用webservice的情況,通常來說如果webservice是用vs+c#來開發的,問題一般來說不大,直接web引用,然后調用就ok了。

流程如下:

C#調用webservice接口的最新方法教程

C#調用webservice接口的最新方法教程

C#調用webservice接口的最新方法教程

C#調用webservice接口的最新方法教程

下面就是進行調用,就這么簡單。

C#調用webservice接口的最新方法教程

但如果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可以在這里下載)。

C#調用webservice接口的最新方法教程

手工修改reference.cs

C#調用webservice接口的最新方法教程

C#調用webservice接口的最新方法教程

以下是調用方法,重點在傳入用戶名和密碼,修改繼承類的重點也在于此;

C#調用webservice接口的最新方法教程

引用完成,調用就會成功了,結果如下:

C#調用webservice接口的最新方法教程

從上面可以看出web引用真的是簡單粗暴,基本不用寫幾句代碼就可以搞定絕大部分的webservice調用。

但是web引用卻有在現實開發中常遇到的缺點:

(1)需要開發環境可以訪問到的wsdl地址;

(2)如果webservice有變化需要更新web引用;

C#調用webservice接口的最新方法教程

那有沒有其它方法呢?答案是有的。一種是直接封裝信封,使用webrequest,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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 = "http://127.0.0.1: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;
  }
 
  }

但是上述方式還是存在問題,如果webservice需要校驗header里面的用戶名與密碼時,雖然信封中封裝了用戶名和密碼,但是一樣調用不成功,同樣的信封內容,使用soap ui卻能成功。可見代碼調用和soap ui調用還是有一定區別的。

另外一種方式是使用動態編譯:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
uri uri = new uri(txt_url.text);
  webrequest webrequest = webrequest.create(uri);
  webrequest.credentials = new networkcredential("hjq", "123");
  system.io.stream requeststream = webrequest.getresponse().getresponsestream();
  // get a wsdl file describing a service
  servicedescription sd = servicedescription.read(requeststream);
  string sdname = sd.services[0].name;
  // add in tree view
 
 
  // initialize a service description servimport
  servicedescriptionimporter servimport = new servicedescriptionimporter();
  servimport.addservicedescription(sd, string.empty, string.empty);
  servimport.protocolname = "soap";
 
  servimport.codegenerationoptions = codegenerationoptions.generateproperties;
 
 
  codenamespace namespace = new codenamespace();
  codecompileunit codecompileunit = new codecompileunit();
  codecompileunit.namespaces.add(namespace);
  // set warnings
  servicedescriptionimportwarnings warnings = servimport.import(namespace, codecompileunit);
 
  if (warnings == 0)
  {
   stringwriter stringwriter = new stringwriter(system.globalization.cultureinfo.currentculture);
   microsoft.csharp.csharpcodeprovider prov = new microsoft.csharp.csharpcodeprovider();
   prov.generatecodefromnamespace(namespace, stringwriter, new codegeneratoroptions());
 
 
 
   // compile the assembly with the appropriate references
   //string[] assemblyreferences = new string[2] { "system.web.services.dll", "system.xml.dll" };
   string[] assemblyreferences = new string[3] {"system.dll", "system.dll", "system.dll" };
   compilerparameters param = new compilerparameters(assemblyreferences);
   param.generateexecutable = false;
   param.generateinmemory = true;
   param.treatwarningsaserrors = false;
   param.warninglevel = 4;
 
   compilerresults results = new compilerresults(new tempfilecollection());
   results = prov.compileassemblyfromdom(param, codecompileunit);
   assembly assembly = results.compiledassembly;
   type service = assembly.gettype(sdname);
 
   methodinfo[] methodinfo = service.getmethods();
   foreach (methodinfo t in methodinfo)
   {
   if (t.name == "discover")
    break;
 
   if (t.name == cbmethods.text)
   {
    //messagebox.show(t.tostring());
    //invoke method
    
    object obj = activator.createinstance(service);
    object response = t.invoke(obj, new object[] { "1","2","3"});
    messagebox.show("result = " + response.tostring());
    break;
   }
   }
  }
 
  }
  catch (exception ex)
  {
  messagebox.show(ex.message);
  }

從這種方式可以看出,首先是訪問wsdl的地址取回webservice的結構,然后采取動態編譯生成本地程序集的方式去調用webservice,和web引用自動生成reference.cs的原理類似;但是明顯這種方式也存在問題,如果webservice的header中需要校驗用戶名與密碼怎么處理呢?

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:http://www.cnblogs.com/goldenbridge/p/7781482.html

延伸 · 閱讀

精彩推薦
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
主站蜘蛛池模板: 日韩在线中文字幕 | 天天草视频 | 无码区国产区在线播放 | 桃色导航 | 男人都懂www深夜免费网站 | 日韩经典在线观看 | 黑人巨茎大战欧美白妇 | 我要看免费毛片 | 美女舒服好紧太爽了视频 | 欧美美女被艹 | 教师波多野结衣在线播放 | 日本孕妇与黑人xxxxxx | 精品一久久香蕉国产线看播放 | 亚州中文字幕 | 亚洲国产中文字幕在线视频综合 | 80日本xxxxxxxxx96| 欧美一卡2卡3卡四卡海外精品 | 亚洲va在线va天堂va偷拍 | 精品国产一级在线观看 | 国内自拍成人网在线视频 | 恩不要好大好硬好爽3p | a一级一级 | 91中文字幕yellow字幕网 | 99夜色| 亚洲热图 | www.色呦呦.com | 日韩精品亚洲专区在线影视 | 荷兰精品女人性hd | 日本69sex护士www| 狠狠的撞进去嗯啊h女强男视频 | 国产精品一级视频 | 波多野结衣在线看 | 美国videos | 成人先锋 | 极品在线 | 国产精品四虎在线观看免费 | ysl千人千色t9t9t9 | 亚洲精品91在线 | 日韩亚洲人成网站在线播放 | 亚洲XXX午休国产熟女屁 | 久久精品国产色蜜蜜麻豆国语版 |