【问题标题】:Webservice C# constructor does not allow arguments?Webservice C# 构造函数不允许参数?
【发布时间】:2009-08-24 02:21:51
【问题描述】:

我正在尝试创建一个 Web 服务,该服务在其构造函数中接受一些参数以节省往返行程,但我不断收到错误消息: CS1729“服务名称”不包含采用“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

【问题讨论】:

  • 我没有测试过,但是构造函数是否暴露为 WebMethod?
  • 你不能将构造函数暴露为网络方法

标签: c# asp.net web-services


【解决方案1】:

实例化客户端代理时不会调用服务器端构造函数。创建服务器端对象时调用它;也就是说,是否以及何时调用 Web 服务方法。

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

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

【讨论】:

  • 是的,它确实有帮助,您知道任何文档或文章来解释 Web 服务的状态吗?我正在寻找一个答案:为什么私有变量在构造函数中设置时会保留值,但如果在 web 方法中设置则不会?
  • 这种情况听起来确实很奇怪,但这很可能是因为您收到一个池实例而不是一个新实例纯粹是偶然的。 Web 服务(ASMX 或 WCF)中的唯一成员变量应该是依赖项(即存储库等)。尝试将状态存储在 Web 服务成员变量中只会让您感到痛苦。
【解决方案2】:

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

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

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

例如:

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

    return yourObject.DoIt(otherData);
}

【讨论】:

  • 实际上我的默认构造函数确实被调用(我正在使用 Visual Studio)但我不能重载它,这就是我面临的问题,但我喜欢你的想法,我确实需要习惯这种“无状态" 概念...
  • 服务端调用构造函数来处理请求。他希望调用非默认构造函数。
  • 我在这篇文章 [xml.com/pub/a/ws/2003/01/08/randyray.html] 中读到了以下内容:“这里需要注意的是,WSDL 1.1 支持重载操作(请参阅下面“资源”部分中的链接),但有已从 WSDL 1.2 的规范草案中删除。"
【解决方案3】:

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

【讨论】:

  • 怎么样?如何将参数传递给默认构造函数?
  • 如果您不需要默认构造函数,请修改它以获取您需要的参数。否则复制它并添加参数。这种代码优先方法不被认为是 Web 服务开发的最佳方法。自己生成 WSDL 和模式并从中工作可能会更好但更慢。
  • 我认为你不明白,或者我可能遗漏了什么,默认构造函数(默认情况下)不接受参数,无论我尝试什么,客户端都不会调用任何带有参数列表的构造函数...关于 c# .net Web 服务的任何地方都有记录吗?
  • @Ayyash。这正是我要说的。开箱即用的服务主机始终使用默认构造函数。如果您希望构造函数获取数据,请调用 DEFAULT 构造函数并从其他地方获取它。
猜你喜欢
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多