2009-08-24 17 views
5

Im gezileri yuvarlak kurtarmak için onun kurucu bazı argüman alan bir web hizmetleri oluşturmaya çalışırken, ama hatayı almaya devam: '1' argümanlar alan yapıcıya içermiyor CS1729 "hizmetadı"Webservice C# yapıcısı argümanlara izin vermiyor mu?

zaman her ne kadar Yerel olarak bir anı yaratmaya çalışıyorum (hizmetle aynı projede) her şey iyi çalışıyor ... ne veriyor?

web hizmeti:

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

tüketimi:

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

çıkışı:

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

Test etmedim ama yapıcı WebMethod olarak mı maruz kalıyor? –

+1

yapıcıyı bir webmothod – Ayyash

cevap

7

. Sunucu tarafı nesnesi oluşturulduğunda çağrılır; Bir web hizmeti yöntemi çağrılırsa, yani.

Ayrıca hiçbir şeye değmez, web hizmetinde örnek üyeleriniz olamaz. Yapıda "isim" kabul edemez ve diğer yöntemlerden kullanamazsınız; Her web hizmeti yöntemine argüman olarak "isim" göndermeniz gerekir.Kısacası, web hizmeti "state", yöntem argümanları veya bir cookie ile servise iletilmelidir (eğer WCF'ye taşınırsanız ikinci bir sorun size yol açacaktır).

Sadece proxy nesnesinde bir yöntem çağırdığınızda, yeni bir sunucu tarafı nesnesi oluşturulduğunu ve nesnenin yok edilmeden önce bu yöntemin çağrıldığını hayal edin. Bu kesinlikle doğru değildir (nesne birleştirilebilir), ancak web hizmetlerinizi tasarlamanıza yardımcı olacaktır.

+0

evet yardımcı oluyor, web servislerinin durumunu açıklayan herhangi bir belge veya makale biliyor musunuz? Bir cevap arıyorum: Neden özel değişkenler yapıcı içinde ayarlanmışsa değerleri korurlar, ancak bir webmethod olarak ayarlanmış değilse? – Ayyash

+0

Bu senaryo garip geliyor, ancak büyük olasılıkla tamamen bir şansa göre yeni bir örneğe bir havuz örneği aldığınız için. Bir web hizmetindeki (ASMX veya WCF) tek üye değişkenleriniz bağımlılıklar (yani, depolar ve benzeri) olmalıdır. Web hizmeti üyesi değişkenlerinde durumu depolamaya çalışmak yalnızca acı çekmenize neden olur. –

2

bir hizmet talebi mesajına default constructor will be called when the service host creates an instance in request.

Neden ihtiyaç duyduğu verileri almak için varsayılan kurucu almıyorsunuz? Parametreli kurucuya yetki verebilirsiniz.

public MyWebService : this(xxx) {} 

Demek hizmet ana daima (varsayılan yapıcı aracılığıyla isteği işlemek için sınıfının bir örneğini oluşturur ki buna parametrelerini geçirmek istiyorsanız birkaç seçenek vardır:.

Standart yapıcıda
  1. o
  2. farklı bir hizmet örneği oluşturma mekanizmasını kullanmak (emin değilim) Request Muhtemelen
  3. yılında extend/modify the asp.net request response pipe line verileri geçirin ihtiyacı verilerini bulun çıkmak. This link has some further examples.

WCF'nin bunu daha kolay bir şekilde yapmanızı sağlayacağına inanıyorum. Ayrıca HTTPListener directly'u da kullanabilirsiniz.

+0

olarak nasıl gösteremezsiniz? Argümanları varsayılan kurucuya nasıl iletirim? – Ayyash

+0

Varsayılan kurucuya ihtiyacınız yoksa, gereksinim duyduğunuz argümanları almak için değiştirin. Aksi takdirde kopyalayın ve argümanlar ekleyin. Bu kod ilk yaklaşımı, web hizmeti geliştirmeye en iyi yaklaşım olarak kabul edilmez. WSDL ve şemaları kendiniz üretmek daha iyi olabilir ama bundan daha iyi olabilir. –

+0

Anladığınızı sanmıyorum, ya da bir şey eksik olabilir, varsayılan contructors (varsayılan olarak) argüman kabul etmiyor ve ne olursa olsun denedim, istemci argüman listesi ile herhangi bir contrutor çağırmaz ... her yerde belgelenmiş olduğunu C#. Net web hizmetleri hakkında? – Ayyash

6

İstemci, web hizmetinizi "başlatıyor" olduğunda, hizmetinizi kurucuyu çağırmıyor. Hizmetinizi temsil eden yerel bir proxy nesnesini başlatıyor. .NET tarafından oluşturulan proxy nesnesi yalnızca varsayılan bir kurucuyu destekler. Bu yüzden bir derleyici hatası aldınız.

Yerel nesnenin çalışmasının nedeni, aslında bir web hizmeti aramamanızdır. Sadece yerel bir nesneyi örneklendiriyorsunuz ve bunun üzerine bir yöntem çağırıyorsunuz.

WebMethod için gerekli olan tüm verileri iletmek için yaklaşımınızı değiştirmeniz gerektiğini düşünüyorum. Web servisleri ile tipik yaklaşım, istenen işlemi gerçekleştirmek için gereken tüm verileri kabul eden vatansız bir hizmete sahip olmaktır. Örneğin

:

Eğer istemci vekil örneğini zaman sunucu tarafı yapıcı çağrılmaz
[WebMethod] 
public string DoSomething(string name, string otherData) 
{ 
    ayyash yourObject = new ayyash(name); 

    return yourObject.DoIt(otherData); 
} 
+0

aslında benim varsayılan kurucum çağırdı (görsel stüdyosu kullanıyorum) ama ben bunu aşırı yükleyemiyorum, bu konuya karşı karşıyayım, ama düşüncenizi beğendim, bu "vatansız" kavramına alışmaya ihtiyacım var ... – Ayyash

+0

Kurucu, isteği işlemek için hizmet tarafına çağrılır. Varsayılan olmayan kurucunun çağrılmasını istiyor. –

+0

Bu makalede okuduğum [http://www.xml.com/pub/a/ws/2003/01/08/randyray.html] aşağıdaki: "Burada aşırı yüklü işlemlerin desteklendiğini belirtmek önemlidir. WSDL 1.1 (aşağıdaki "Kaynaklar" bölümündeki bağlantılara bakın), ancak WSDL 1.2 için taslak belirtiminden kaldırılmıştır. " – Ayyash

İlgili konular