Конструктор Webservice C # не допускает аргументов? - PullRequest
5 голосов
/ 24 августа 2009

Я пытаюсь создать веб-сервисы, использующие некоторые аргументы в своем конструкторе для сохранения циклов, но я получаю сообщение об ошибке: 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

Ответы [ 3 ]

7 голосов
/ 24 августа 2009

Конструктор на стороне сервера не вызывается при создании экземпляра прокси клиента. Он вызывается при создании объекта на стороне сервера; то есть, если и когда вызывается метод веб-службы.

Также ничего не стоит, потому что вы не можете иметь членов экземпляра в веб-сервисе. Вы не можете принять «имя» в конструкторе и использовать его из других методов; Вы должны отправить «имя» в каждый метод веб-службы в качестве аргумента. Короче говоря, «состояние» веб-службы должно быть передано службе через аргументы метода или файл cookie (хотя использование последнего вызовет проблемы при переходе на WCF).

Только представьте, что каждый раз, когда вы вызываете метод для вашего прокси-объекта, создается новый объект на стороне сервера, и этот метод вызывается до того, как объект будет уничтожен. Это не совсем верно (объект может быть объединен), но это поможет вам спроектировать ваши веб-сервисы.

6 голосов
/ 24 августа 2009

Когда клиент "создает экземпляр" вашего веб-сервиса, он не вызывает конструктор вашего сервиса. Это создание экземпляра локального прокси-объекта, представляющего ваш сервис. Прокси-объект, сгенерированный .NET, поддерживает только конструктор по умолчанию. Вот почему вы получаете ошибку компилятора.

Причина, по которой работает локальный объект, заключается в том, что вы на самом деле не вызываете веб-сервис. Вы просто создаете экземпляр локального объекта и затем вызываете метод для него.

Я думаю, вам нужно изменить свой подход, чтобы передавать все данные, необходимые для WebMethod. Типичный подход к веб-службам заключается в том, чтобы иметь службу без сохранения состояния, которая принимает все данные, необходимые для выполнения запрошенной операции.

Например:

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

    return yourObject.DoIt(otherData);
}
2 голосов
/ 24 августа 2009

Конструктор по умолчанию будет вызываться, когда узел службы создает экземпляр в запросе к сообщению запроса службы.

Почему бы не получить конструктор по умолчанию для получения необходимых данных? Вы можете делегировать параметризованный конструктор.

public MyWebService : this(xxx) {}

Я имею в виду, что хост службы всегда будет создавать экземпляр вашего класса (для обработки запроса через конструктор по умолчанию. Если вы хотите передать ему параметры, у вас есть несколько вариантов:

  1. В конструкторе Default отключите поиск необходимых данных
  2. Передать данные в запросе
  3. Возможно (я не уверен) расширить / изменить конвейерную линию ответа на запрос asp.net , чтобы использовать другой механизм создания экземпляра службы. У этой ссылки есть еще несколько примеров.

Я полагаю, что WCF позволит вам легче это делать. Также вы можете использовать HTTPListener напрямую .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...