2009-08-24 1 views
5

Im пытается создать веб-службы, которая принимает некоторые аргументы в его конструкторе, чтобы сохранить обходов, но я получаю сообщение об ошибке: CS1729 «имя_службы» не содержит конструктор, который принимает аргументы «1»Конструктор WebService C# не разрешает аргументы?

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

веб-сервис:

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? –

+1

Вы не можете разоблачить конструктора как webmodod – Ayyash

ответ

7

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

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

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

+0

да, это помогает, знаете ли вы какую-либо документацию или статьи, чтобы объяснить состояние веб-сервисов? im ищет ответ на: почему частные переменные сохраняют значения, если они установлены внутри конструктора, но не установлены ли в веб-методе? – Ayyash

+0

Этот сценарий звучит странно, но, скорее всего, потому, что вы получаете экземпляр пула против нового экземпляра исключительно случайно. Ваши единственные переменные-члены в веб-службах (ASMX или WCF) должны быть зависимыми (т. Е. Репозиториями и т. Д.). Попытка сохранить состояние в переменных члена веб-службы вызовет только боль. –

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

+0

Если вам не нужен конструктор по умолчанию, измените его, чтобы принять необходимые вам аргументы. В противном случае скопируйте его и добавьте аргументы. Этот первый подход кода не считается лучшим подходом к разработке веб-сервисов. Может быть лучше, но медленнее генерировать WSDL и схемы самостоятельно и работать с этим. –

+0

Я не думаю, что вы понимаете, или, может быть, я что-то упускаю, разработчики по умолчанию (по умолчанию) не принимают аргументы, и независимо от того, что я пытаюсь, клиент не вызывает какой-либо contructor с списком аргументов ... это документировано где угодно о веб-сервисах C# .net? – Ayyash

6

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

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

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

Например:

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

    return yourObject.DoIt(otherData); 
} 
+0

Фактически, мой конструктор по умолчанию действительно вызван (я использую визуальную студию), но я не могу его перегрузить, это проблема, с которой сталкивается проблема, но мне нравится ваше мышление, мне нужно привыкнуть к этой концепции «без гражданства» ... – Ayyash

+0

конструктор получает вызов на стороне обслуживания для обработки запроса. Он хочет, чтобы вызывал нестандартный конструктор. –

+0

Я читал в этой статье [http://www.xml.com/pub/a/ws/2003/01/08/randyray.html] следующее: «Здесь важно отметить, что перегруженные операции поддерживаются в WSDL 1.1 (см. Ссылки в разделе «Ресурсы» ниже), но были удалены из черновика спецификации WSDL 1.2. » – Ayyash

Смежные вопросы