2008-12-18 55 views
11

我已經收到了一些文件,從我們的供應商之一,他們正在發佈web服務,他們是非常具體的,關於他們的WebMethods一場爭論已經out修飾符之一( ?不知道這是正確的描述),例如考慮以下的WebMethod簽名:的.Net Web服務和OUT/REF的WebMethod參數

[WebMethod] 
public void HelloWorld(out string strVal) 
{ 
    strVal = "Hello World"; 
} 

[顯然實際的方法不是一個Hello World方法]

現在,我從來沒有考慮設計的WebMethod用out/REF參數,它讓我不知道他們爲什麼會使用過它。

試圖理解這個設計決策的一個應用程序我把一個原型和幾個基本的Hello World風格的webmethods一起扔了......一個帶有一個輸出字符串參數,一個帶有兩個輸出字符串參數,另一個沒有接收任何參數,但返回一個字符串。

一旦試圖從一個單獨的應用程序引用我的webmethods,我注意到我必須訪問單個輸出字符串參數的方法完全一樣,如果我定義了輸出字符串的方法,以便實際上客戶擔心:

public string HelloWorld1() 
{ 
    return "Hello World"; 
} 

public void HelloWorld2(out string strVal) 
{ 
    strVal = "Hello World"; 
} 

完全相同...中,我要引用它們既作爲此種[其中x是取代爲正確的方法]:

string val = HelloWorldX(); 

已經試圖引用我在將訪問他們的方式方法,如果他們不是Web方法[像這樣]:

string val = string.Empty; 
MyService1.HelloWorld(out val); 
Console.WriteLine(val); 

這會導致編譯錯誤,指出沒有方法的參數接受1個輸入。這是爲什麼?有顯然是接受一個參數的Web方法 - 我看它[HelloWorld2。

考察了SOAP響應,我注意到,對於HelloWorld1響應的內容是:

<HelloWorld1Response xmlns="http://tempuri.org/"> 
    <HelloWorld1Result>string</HelloWorld1Result> 
</HelloWorld1Response> 

而且HelloWorld2是

<HelloWorld2Response xmlns="http://tempuri.org/"> 
    <strVal>string</strVal> 
</HelloWorld2Response> 

再進一步我想,如果我有什麼2參考參數...

public void HelloWorld3(out string strVal1, out string strVal2) 
{ 
    strVal1 = "Hello World"; 
    strVal2 = "Hello World Again!"; 
} 

這會生成SOAP內容:

<HelloWorld3Response xmlns="http://tempuri.org/"> 
    <strVal1>string</strVal1> 
    <strVal2>string</strVal2> 
</HelloWorld3Response> 

我認爲合理,所以理論上[提供我可以想出一個辦法,以/ REF參數傳遞出來的WebMethods]這意味着我可以只通過在可以通過該方法來設置兩個參數,但是當我這樣做:

string val1 = string.Empty; 
string val2 = string.Empty; 
MyService1.HelloWorld3(out val1,out val2); 
Console.WriteLine(val1); 
Console.WriteLine(val2); 

我應該得到我看到,當我試圖引用HelloWorld2這種方式同樣編譯錯誤。與它的抱怨約2參數,而不是1明顯異常[而事實上我得到了同樣的異常,我測試了它。

  • 是怎麼回事?
  • 是否有一個原因,或者使用出的WebMethods/REF論點,我缺少的方法嗎?
  • 如果有,我怎麼引用多了/ REF參數的WebMethods?

回答

15

呃......我不知道該協議是什麼,你自己的問題提供答案,而是由史蒂芬貝肯引用的文章提供了一些線索,我推斷解決這一奇怪的局面,而不是讓其他人要弄清楚的影響是什麼,我想我會分享我的發現......

因此,考慮我的WebService定義現在

[WebMethod] 
public string Method1() 
{ 
    return "This is my return value"; 
} 

[WebMethod] 
public void Method2(out string strVal1) 
{ 
    strVal1 = "This is my value passed as an output"; 
    //No return value 
} 

[WebMethod] 
public void Method3(out string strVal1, out string strVal2) 
{ 
    strVal1 = "This is my strVal1 value passed as an output"; 
    strVal2 = "This is my strVal2 value passed as an output"; 
    //No return value 
} 

[WebMethod] 
public string Method4(out string strVal1, out string strVal2) 
{ 
    strVal1 = "This is my strVal1 value passed as an output"; 
    strVal2 = "This is my strVal2 value passed as an output"; 
    return "This is my return value"; 
} 

以下的webMethods ......根據該文件中,第一個參數定義爲Out,如果該方法返回void,則返回第一個參數ameter自動用作返回參數。

方法一::所以我如下將訪問我的每一個方法公共字符串方法1(){}

var str = svc.Method1(); 
Console.WriteLine(str); 

方法二:公共無效方法2(串出strVal1){}

var str = svc.Method2(); 
Console.WriteLine(str); 

所以你以完全相同的方式訪問它們......這非常混亂。誰會在沒有被其他人告知的情況下解決這個問題?這是我無法理解這怎麼會是個好主意......

方法3:公共無效方法3(串出strVal1,串出strVal){}

var str2 = String.Empty; 
var str1 = svc.Method3(out str2); 
Console.WriteLine(str1); 
Console.WriteLine(str2); 

方法4:公共字符串方法4(串出strVal1 ,串出strVal2){}

var str1 = String.Empty; 
var str2 = String.Empty; 
var str3 = svc.Method4(out str1, out str2); 
Console.WriteLine(str1); 
Console.WriteLine(str2); 
Console.WriteLine(str3); 

所以當你看到 - 如果方法簽名不提供返回值是返回void],那麼第一個參數變成返回值。如果它已經提供了返回值,那麼它不會。

這對於有人未跨過那個文件來極爲混亂。非常感謝提供該鏈接史蒂文 - 我真的很感激它。

...並給誰就給誰決定設計模式是一個好主意,被寫入.NET框架 - 我不認爲你會一直posessed你認爲這是一個好主意......我真的完全不喜歡你。

附錄:

我纔剛剛意識到的是,添加了混亂,如果你使用參考而不是那麼你做到這一點,你」 d精確處理WebMethods,就像您使用它們在應用程序中調用常規方法一樣:

[WebMethod()] 
public void Method3(ref string strVal1, ref string strVal2) 
{ 
    strVal1 = "First argument return value"; 
    strVal2 = "Second argument return value"; 
} 

現在來調用你會使用:

string val1 = String.Empty; 
string val2 = String.Empty; 
svc.Method3(ref val1, ref val2); 
Console.WriteLine(val1); 
Console.WriteLine(val2); 

這種不一致性mindboggling ......事實上,它的設計是無法理解我。

+0

當你達到2000的聲望時,我相信正確的協議將會是編輯Steven Behnke的答案......就像它可能感覺到的侵入性一樣。但發佈你的總結很好。 +1 – 2008-12-19 14:17:30