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!