2009-08-24 47 views
5

我试着去创建一个Web服务,需要一些论据在其构造,以节省往返,但我不断收到错误: CS1729“服务名”不包含一个构造函数“1”的论点Webservice C#构造函数不允许参数?

虽然当我尝试在本地创建即时(在与服务相同的项目中),一切正常......什么给予了?

web服务:

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

我还没有测试,但作为WebMethod公开的构造函数? – 2009-08-24 02:39:02

+1

你不能公开构造函数作为webmothod – Ayyash 2009-08-24 03:19:33

回答

7

当实例的客户端代理服务器侧的构造不叫。它在创建服务器端对象时调用;也就是说,如果以及何时调用Web服务方法。

同样值得一提的是,您不能在Web服务上拥有实例成员。你不能接受构造函数中的“名称”并从其他方法中使用它;您必须将“名称”作为参数发送到每个Web服务方法中。简而言之,Web服务“状态”必须通过方法参数或cookie传递给服务(尽管如果您转移到WCF,使用后者会导致问题)。

想象一下,每次调用代理对象的方法时,都会创建一个新的服务器端对象,并在该对象被销毁之前调用该方法。这不是完全正确的(对象可以合并),但它可以帮助您设计您的Web服务。

+0

是的,它确实有帮助,您是否知道任何文档或文章来解释web服务的状态?即时寻找一个答案:为什么私人变量保留值,如果在构造函数内设置,但不是如果设置在一个webmethod? – Ayyash 2009-08-24 21:36:40

+0

这种情况听起来很奇怪,但很可能是因为你纯粹偶然地收到一个池实例与一个新实例。您在Web服务(ASMX或WCF)中唯一的成员变量应该是依赖关系(即存储库等)。尝试在Web服务成员变量中存储状态只会导致你痛苦。 – 2009-08-25 07:04:29

2

default constructor will be called when the service host creates an instance in request到的服务请求消息。

为什么不能获取默认构造函数来获取它需要的数据?你可以委托给参数化的构造函数。

public MyWebService : this(xxx) {} 

我的意思是,服务主机将始终创建类的实例(处理通过默认的构造函数的请求。如果你想传递参数给它,你有多种选择:

  1. 在默认构造方法熄灭的定位所需
  2. 传入请求
  3. 可能的数据(我不知道)extend/modify the asp.net request response pipe line使用不同的服务实例的创建机制中的数据。This link has some further examples.

我相信WCF可以让你更轻松地做到这一点。您也可以使用HTTPListener directly

+0

怎么样?我如何将参数传递给默认构造函数? – Ayyash 2009-08-24 02:49:10

+0

如果您不需要默认构造函数,请修改它以获取所需的参数。否则,复制它并添加参数。这种代码优先方法并不被认为是Web服务开发的最佳方法。生成WSDL和架构可能会更好,但速度更慢,并且可以从中解决问题。 – 2009-08-24 02:51:50

+0

我不认为你理解,或可能是我缺少的东西,默认构造函数(默认情况下)不接受参数,不管我尝试什么,客户端不会调用具有参数列表的任何构造函数......是在任何地方记录关于c#.net web服务? – Ayyash 2009-08-24 03:17:42

6

当客户端“实例化”您的Web服务时,它不会调用您服务上的构造函数。它正在实例化一个代表你的服务的本地代理对象。由.NET生成的代理对象只支持默认构造函数。这就是你遇到编译器错误的原因。

本地对象工作原因是您实际上没有调用Web服务。你只是实例化一个本地对象,然后调用一个方法。

我认为你需要改变你的方法来传递WebMethod所需的所有数据。 Web服务的典型方法是使用无状态服务,接受执行请求操作所需的所有数据。

例如:

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

    return yourObject.DoIt(otherData); 
} 
+0

构造函数在服务端被调用来处理请求。他希望调用非默认构造函数。 – 2009-08-24 05:38:13

+0

我在这篇文章[http://www.xml.com/pub/a/ws/2003/01/08/randyray.html]中读到以下内容: “这里需要注意的是重载操作在WSDL 1.1(请参阅下面“参考资料”一节中的链接),但已从WSDL 1.2规范草案中删除。“ – Ayyash 2009-08-24 21:34:10

相关问题