程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 手把手教你學Web Service

手把手教你學Web Service

編輯:關於VC++

Well,各位觀眾,現在開始我的手把手交Visual Studio.net的第一課―-手把手教你學Web Service.有沒有下一課還得看諸位看官的反應了!我們知道,在MS新一代戰略.net中,Web Service占了一個相當次大的份量,為什麼這樣說那?那是因為Web Service 是未來編程的新 思路,他將編程由本機擴大到了Internet上,他通過一個proxy.dll就可以訪問在Internet上 提供的Service,並且就像在本機上操作一樣方便,其實,Web Service也可以看成是Web上的 Class,這樣,大家code時候就不用局限於本機,本局域網…的限制了。

既然 Web Service這麼好,怎樣寫阿?在下就將在Visual Studio.net 中究竟如何編寫Web Service的全過程一一奉上。

所有的編程教程不免都已Hello World作為開始,我也難 免如此。

//Web Service建立的方法不用說了吧?
//project->new- >asp.net web service->輸入名稱…..
   1.Hello World~~
[WebMethod]
public string HelloWorld()
{
   return "Hello World"
}

其實,這個函數在一生成Web Service的時候已經生成, 只不過注釋起來了。先不要執行這個Web Service,先研究一下,這個WS沒有輸入參數,輸出 參數string類型,那麼執行期間會有什麼情況了?按!執行,彈處一個IE,上面有一打廢話( 對於初學者,呵呵)。最有用的是開頭兩句:

The following operations are supported. For a formal definition, please review the Service Description.

Hello World

好了,我們的方法出現在上面了。點擊HelloWorld 鏈接,就進入到下一個頁面,有一個invoke按鈕,還有這樣的字:

Test

To test, click the ’Invoke’ button.

按了之後,就出現:

<?xml version="1.0" encoding="utf-8" ?>
<string xmlns="http://tempuri.org/">Hello World</string>

OK!我們的第一個Web Service 成功了!

2.讓 我們試一下改改一些東西,輸入參數好像太簡單了,加點東西吧:

public string HelloWorld(string strInput)

返回值變為return str+"Hello World"

其余不變,有什麼事情發生那?執行之,第一個界面不變,但是有 invoke按鈕的那個頁面就不同了,多了一個表格,parameter那一列多了個strInput:,value 那列多了一個text box。喔,原來是在text box裡面輸入strInput的值。隨便打什麼,比方 說"Nfs is the best",按invoke按鈕,返回如下信息:

<?xml version="1.0" encoding="utf-8" ?>
   <string xmlns="http://tempuri.org/">Nfs is the best Hello World</string>

會用了嗎?

3.在變化一些,輸入參數變為數組

public string HelloWorld(string[] str)
{
   return str [0]+"Hello World";
}

執行之,第一個頁面好像沒什麼問題 ,但是一點hello world這個鏈接,就好像出錯了!

Test Test forms are only available for methods with non-array primitive types as parameters.
SOAP
The following is a sample SOAP request and response. The placeholders shown need to be replaced with actual values.
.............

怎麼回事?Web Service不能使用數組,只能是簡單的變量?也太差勁了吧? 非也!這只是說明該Web Service輸入參數的數目不能在ie中定下來,當然無法顯示了,現在 ,新建一個Application,例如說是Windows Application, 然後再form1上加一個button,雙 擊,出現事件:

private void button1_Click(object se nder, System.EventArgs e)

在Solution Explore中添加Web Reference, IP為localhost。UDDI(MS的討厭的命 名,呵呵)會幫我們找到剛才我們寫的Web Service。在button 1_Click中,添加如下語句:

localhost1.Service1 ls=new localhost1.Service1();
string[] strIn=new string [2];
strIn[0]="Nfs is the best ";
string strRet= ls.HelloWorld(strIn);

單步跟蹤,你會發現strRet="Nfs is the best Hello World"

成功!

4.好了,簡單變量的輸入輸出都試完了 ,(注意,沒有試輸出為數組的情形,為什麼?諸位看官自有公論,C#能返回指針麼?呵呵 ,在輸入中采用out 或者ref 方式坑可能會好些把?),還有什麼沒有試?自定義對象!試 試看?

public class Foo
{
   public Foo(int x)
   {
     str=new string[x];
   }
   public string[] str;
}
public string HelloWorld(Foo FooTest)
{
   for(int i=0;i<FooTest.str.Length;i++)
     FooTest.str[i]+=" Hello World"+i.ToString();
     //do something
   return "Hello World";
}

編譯,完了,第一個頁面就說:

Server Error in ’/WebService4’ Application.

WebService4.Service1+Foo cannot be serialized because it does not have a default public constructor.

Description: An unhandled exception occurred during the execution of the current web request.Please review the stack trace for more information about the error and where it originated in the code.

Exception Details:System.Exception: WebService4.Service1+a cannot be serialized because it does not have a default public constructor.

Source Error:一大堆Error

怎麼回事!看看error吧!WebService4.Service1+Foo出問題了, 什麼問題?

it does not have a default public constructor.

Faint,是都 有default的嗎?沒有,系統會生成一個的波!不管了,加上一個。

public Foo()
{
   //do nothing
}

再編譯,成功了!至少Hello World的第一個頁面出來了點擊鏈接,不錯,如你所想,還是出現上述輸入數組的情形,道理 都明白了嗎?

Test

No test form is available as this service or method does not support the HTTP GET protocol.

SOAP

The following is a sample SOAP request and response.

The placeholders shown need to be replaced with actual values.

沒事的,象3中情況一樣,調用是沒有問題的,放心 !

5.好像都將完了吧?沒有!諸位有沒有考慮到在人家的程序中調用我的時候,怎樣 定的輸入參數的類型?該類型使我自己定義的啊!如上變量Foo。好,我們到剛才生成的 Windows Application裡面看看那。在Solution Explore中的localhost,右鍵選擇Update Web Referece。(我們改過,他可不知道,呵呵)把原來的語句改成:

localhost.Service1 ls=new localhost.Service1();

localhost.Foo FooTest=new localhost.Foo();

按點的時候,自動Foo會彈出來了,一切正常,沒什 麼特別啊?好,我們回去改改Web Service。將class Foo改為:

public class Foo
{
   public Foo ()
   {
   }
   public Foo (int x)
   {
     str=new string[x];
   }
   public class HiddenOrNot
   {
     public HiddenOrNot()
     {
       //do nothing
     }
   }
   public string[] str;
}

Web Method不變。回去Windows Application裡面,再 update一次,試試輸入ls.,看看彈出來什麼?沒有我們新加上去的HiddenOrNot類吧?奇怪 ,我明明聲明他是public的波!怎麼不行?我們再回去Web Service,將Web Method改為:

public string HelloWorld(Foo FooTest, Foo.HiddenOrNot fhTest)
{
   //do something
}

回去Windows Application 裡面,再 update一次,試試輸入ls.,再看看彈出來什麼? 有了!有ls.Foo 和ls.HiddenOrNot了。看 來,Web Reference中,你的Web Service對象是否可見,就是根據輸入參數確定的,他才不 管你是public那(對了,記得constractor要為public波,還要有default constrator)。

6.好了,剩余的問題,就是上面幾種情況的綜合了,根據排列組合定理...嗯,不 說了。各位看官自行實踐ba!

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved