簡體   English   中英

Webservice C#構造函數不允許參數?

[英]Webservice C# constructor does not allow arguments?

我試圖創建一個Web服務,在其構造函數中采取一些參數來保存往返,但我不斷得到錯誤:CS1729“servicename”不包含帶有'1'參數的構造函數

雖然當我嘗試在本地創建一個即時(在與服務相同的項目中)一切正常但是...給出了什么?

網絡服務:

public class ayyash : System.Web.Services.WebService {

    private string _myname;
    public ayyash (string myname) {


        _myname = myname;

        //Uncomment the following line if using designed components 
        //InitializeComponent(); 
    }
}

消費:

ayyash a = new ayyash("my name is ayyash");

輸出:

Compiler Error Message: CS1729: 'ayyash' does not contain a constructor that takes '1' arguments

在實例化客戶端代理時,不會調用服務器端構造函數。 在創建服務器端對象時調用它; 也就是說,如果和何時調用Web服務方法。

同樣值得一提的是,您不能在Web服務上擁有實例成員。 你不能在構造函數中接受“name”並從其他方法中使用它; 您必須將“name”作為參數發送到每個Web服務方法中。 簡而言之,必須通過方法參數或cookie將Web服務“state”傳遞給服務(盡管如果轉移到WCF,使用后者會導致問題)。

想象一下,每次在代理對象上調用方法時,都會創建一個新的服務器端對象,並在銷毀對象之前調用該方法。 這並不嚴格(對象可以合並),但它可以幫助您設計Web服務。

當客戶端“實例化”您的Web服務時,它不會在您的服務上調用構造函數。 它實例化一個代表您的服務的本地代理對象。 .NET生成的代理對象僅支持默認構造函數。 這就是您遇到編譯器錯誤的原因。

本地對象工作的原因是您實際上並未調用Web服務。 您只是實例化一個本地對象,然后在其上調用一個方法。

我認為你需要改變你的方法來傳遞WebMethod所需的所有數據。 Web服務的典型方法是使用無狀態服務,該服務接受執行所請求操作所需的所有數據。

例如:

[WebMethod]
public string DoSomething(string name, string otherData)
{
    ayyash yourObject = new ayyash(name);

    return yourObject.DoIt(otherData);
}

當服務主機在對服務請求消息的請求中創建實例時,將調用默認構造函數

為什么不獲取默認構造函數來獲取它需要的數據? 您可以委托參數化構造函數。

public MyWebService : this(xxx) {}

我的意思是服務主機將始終創建您的類的實例(通過默認構造函數處理請求。如果您想將參數傳遞給它,您有許多選項:

  1. 在Default構造函數中,找到所需的數據
  2. 傳遞請求中的數據
  3. 可能(我不確定) 擴展/修改asp.net請求響應管道線以使用不同的服務實例創建機制。 此鏈接還有一些示例。

我相信WCF可以讓您更輕松地完成此任務。 您也可以直接使用HTTPListener

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM