2009-08-24 18 views
5

Im próbuje utworzyć usług internetowych, które zajmuje trochę argumentów konstruktora, aby zapisać w obie strony, ale wciąż otrzymuję błąd: CS1729 „nazwa_usługi” nie zawiera konstruktor, że trwa argumentów „1”Konstruktor Webservice C# nie pozwala na argumenty?

chociaż kiedy Próbuję stworzyć natychmiastowo lokalnie (w tym samym projekcie co usługa) wszystko działa dobrze ... co daje?

serwis internetowy:

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(); 
    } 
} 

zużycie:

ayyash a = new ayyash("my name is ayyash"); 

wyjściowa:

Compiler Error Message: CS1729: 'ayyash' does not contain a constructor that takes '1' arguments 
+0

Nie testowałem, ale czy konstruktor jest odsłonięty jako WebMethod? –

+1

Nie można ujawnić konstruktora jako webmothod – Ayyash

Odpowiedz

7

Bok konstruktor serwer nie jest wywoływana podczas wystąpienia serwera proxy klienta. Jest wywoływana, gdy tworzony jest obiekt po stronie serwera; to jest, jeśli i kiedy wywoływana jest metoda usługi sieciowej.

Również wartość nie jest taka, że ​​nie można mieć członków instancji w serwisie WWW. Nie możesz zaakceptować "nazwy" w konstrukcie i używać jej z innych metod; musisz wysłać "nazwę" do każdej metody usługi sieciowej jako argument.W skrócie, "stan" usługi sieciowej musi zostać przekazany do usługi za pośrednictwem argumentów metody lub pliku cookie (chociaż użycie tego ostatniego spowoduje problemy, jeśli przejdziesz do WCF).

Wyobraź sobie, że za każdym razem, gdy wywołujesz metodę na obiekcie proxy, tworzony jest nowy obiekt po stronie serwera i ta metoda jest wywoływana przed zniszczeniem obiektu. Nie jest to ściśle prawdą (obiekt może być łączony), ale pomoże ci zaprojektować twoje usługi sieciowe.

+0

tak to pomaga, czy znasz jakąkolwiek dokumentację lub artykuły wyjaśniające stan usług internetowych? Zamierzamwdrożyć odpowiedzi na: dlaczego zmienne prywatne zachować wartości, jeśli ustawione w konstruktorze, ale nie, jeśli ustawione w webmethod? – Ayyash

+0

Ten scenariusz brzmi dziwnie, ale najprawdopodobniej otrzymujesz instancję puli od nowej instancji wyłącznie przez przypadek. Jedynymi zmiennymi składowymi w usługach sieciowych (ASMX lub WCF) powinny być zależności (np. Repozytoria i inne). Próba zapisania stanu w zmiennych członków usługi internetowej spowoduje tylko ból. –

2

default constructor will be called when the service host creates an instance in request do wiadomości żądania usługi.

Dlaczego nie uzyskać domyślnego konstruktora, aby uzyskać potrzebne dane? Można przekazać do sparametryzowanego konstruktora.

public MyWebService : this(xxx) {} 

Chodzi mi o to, że gospodarz usługa będzie zawsze utworzyć instancję klasy (aby obsłużyć żądania za pomocą domyślnego konstruktora Jeśli chcesz przekazać parametry do niego masz kilka opcji.

  1. w konstruktorze domyślnym iść off zlokalizować dane, które musi
  2. przekazać dane we Wniosku
  3. Prawdopodobnie (nie jestem pewien) extend/modify the asp.net request response pipe line użyć innego mechanizmu tworzenia instancji usługi. This link has some further examples.

Wierzę, że WCF pozwoli Ci łatwiej to zrobić. Możesz również użyć HTTPListener directly.

+0

jak? jak przekazać argumenty do domyślnego konstruktora? – Ayyash

+0

Jeśli nie potrzebujesz domyślnego konstruktora, zmodyfikuj go, aby pobrać potrzebne argentyny. W przeciwnym razie skopiuj go i dodaj argumenty. To pierwsze podejście do kodu nie jest uważane za najlepsze podejście do tworzenia usług sieciowych. Może być lepiej, ale wolniej generować WSDL i schematy samemu i pracować nad tym. –

+0

Nie sądzę, że rozumiesz, lub może jestem coś brakuje, domyślne contructors (domyślnie) nie akceptuj argumentów, i bez względu na to, co próbuję, klient nie wywołuje żadnego contructor z listy argumentów ... jest to udokumentowane w dowolnym miejscu o usługach internetowych w C# .net? – Ayyash

6

Gdy klient "tworzy instancję" swojej usługi internetowej, nie wywołuje konstruktora w serwisie. Tworzy instancję lokalnego obiektu proxy, który reprezentuje twoją usługę. Obiekt proxy generowany przez .NET obsługuje tylko domyślny konstruktor. Właśnie dlatego pojawia się błąd kompilatora.

Powodem, dla którego obiekt lokalny działa, jest fakt, że w rzeczywistości nie wywołujesz usługi internetowej. Po prostu tworzysz lokalny obiekt, a następnie wywołujesz na nim metodę.

Myślę, że należy zmienić podejście do przekazywania wszystkich danych wymaganych do WebMethod. Typowym podejściem do usług sieciowych jest posiadanie usługi bezstanowej, która akceptuje wszystkie dane wymagane do wykonania żądanej operacji.

Na przykład:

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

    return yourObject.DoIt(otherData); 
} 
+0

faktycznie mój domyślny konstruktor nie jest wywoływany (używam visual studio), ale nie mogę go przeciążać, to jest problem z widokiem, ale lubię twoje myślenie, muszę przyzwyczaić się do tej "bezpaństwowej" koncepcji ... – Ayyash

+0

konstruktor zostaje wywołany po stronie usługi w celu przetworzenia żądania. Chce, aby wywoływany był inny niż domyślny konstruktor. –

+0

Przeczytałem w tym artykule [http://www.xml.com/pub/a/ws/2003/01/08/randyray.html] następujące: "Ważne jest, aby pamiętać, że przeciążone operacje są obsługiwane w WSDL 1.1 (zobacz łącza w sekcji "Zasoby" poniżej), ale zostały usunięte z projektu specyfikacji dla WSDL 1.2. " – Ayyash