我试图创建一个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
答案 0 :(得分:7)
实例化客户端代理时,不会调用服务器端构造函数。在创建服务器端对象时调用它;也就是说,如果和何时调用Web服务方法。
同样值得一提的是,您不能在Web服务上拥有实例成员。你不能在构造函数中接受“name”并从其他方法中使用它;您必须将“name”作为参数发送到每个Web服务方法中。简而言之,必须通过方法参数或cookie将Web服务“state”传递给服务(但如果转移到WCF,使用后者会导致问题)。
想象一下,每次在代理对象上调用方法时,都会创建一个新的服务器端对象,并在销毁对象之前调用该方法。这并不严格(对象可以合并),但它可以帮助您设计Web服务。
答案 1 :(得分:6)
当客户端“实例化”您的Web服务时,它不会调用您服务上的构造函数。它实例化一个代表您的服务的本地代理对象。 .NET生成的代理对象仅支持默认构造函数。这就是您遇到编译器错误的原因。
本地对象工作的原因是您实际上并未调用Web服务。您只是实例化一个本地对象,然后在其上调用一个方法。
我认为你需要改变你的方法来传递WebMethod所需的所有数据。 Web服务的典型方法是使用无状态服务来接受执行请求操作所需的所有数据。
例如:
[WebMethod]
public string DoSomething(string name, string otherData)
{
ayyash yourObject = new ayyash(name);
return yourObject.DoIt(otherData);
}
答案 2 :(得分:2)
default constructor will be called when the service host creates an instance in request到服务请求消息。
为什么不获取默认构造函数来获取所需的数据?您可以委托参数化构造函数。
public MyWebService : this(xxx) {}
我的意思是服务主机将始终创建您的类的实例(通过默认构造函数处理请求。如果您想将参数传递给它,您有许多选项:
我相信WCF可以让您更轻松地完成此操作。您也可以使用HTTPListener directly。