Webservice C#构造函数不允许参数?

我试图创建一个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 。