2012-10-18 21 views
5

C# içinde bir WCF ve aynı anda tüketecek bir istemci yapıyorum. Nedense bir int dönüşü için bir yöntem almakta sorun yaşıyorum. Bunu uygulayanWCF bir int dönmeyecek

İşte
[ServiceContract] 
public interface IMData 
{ 
    [OperationContract] 
    int ReturnAnInt(); 

    [OperationContract] 
    String HelloWorld(); 
} 

geçerli:: İşte benim sözleşmedir

public class MData : IMData 
{ 
    public String HelloWorld() 
    { 
    return "Hello World"; 
    } 

    public int ReturnAnInt() 
    { 
    return 5; 
    } 
} 

Visual Studio kullanıyorum ve müşteri için, bir Web başvurusu olarak bu WCF ithal. Şimdi bir nedenle MData örneğini bildirdiğimde ve HelloWorld'ü aramaya çalıştığımda, sorun yok, ancak ReturnAnInt'i çağırırken derleme hatası alıyorum.

MData m = new MData(); 
String helloWorld = m.HelloWorld(); 
int result = m.ReturnAnInt(); 

Ben ReturnAnInt ile almak hatadır: "Hayır aşırı yük yöntemi 'ReturnAnInt' için geçen 0 argümanlar" Öyleyse Ben fareyi üzerine bekliyor Görsel Ne Studio görüyorum, o yöntem bakmak gerektiğini söylüyor etmek gibi:

void MData.ReturnAnInt(out int ReturnAnIntResult, out bool ReturnAnIntResultSpecified) 

şimdi saatlerce bu üzerinde kafamı duvara vurarak edilmiş ve Google'da bir şey bulabilirsiniz ve benim arkadaşları yanı şaşkın vardır. Neden bu tanımda olmayan iki parametre eklediniz ve dönüş türünü değiştirdiniz? Herhangi bir yardım büyük takdir edilecektir. Yardımcı olabilecek herhangi bir bilgiyi çıkarsam özür dilerim.

cevap

4

Web Referansı (eski teknoloji) yerine Servis Referansı (daha yeni teknoloji) olarak alabilir misiniz? Hizmet referansları ile WCF hizmetleri ile çalışıyorum ve böyle bir sorun görmedim - hizmet tanımının int olmasına izin verdiğinde, sadece Specified özelliğinin (ve int ile birlikte bir özellik olarak, iki out param dahil değil) gördüm Belirtilen (WCF tarafından oluşturulan hizmet tanımlarım, deneyimlerimde beklendiği gibi çalışır). Eğer daha iyi bir çözüm bulamazsa

, burada partial classes kullanarak bir geçici çözüm var:

public partial class MData 
{ 
    public int ReturnAnInt() 
    { 
     int result; 
     bool specified; 
     this.ReturnAnInt(out result, out specified); 
     if (!specified) throw new InvalidOperationException(); 
     return result; 
    } 
} 

Güncellemehttp://www.codeproject.com/Articles/323097/WCF-ASMX-Interoperability-Removing-the-Annoying-xx (bir struct dönmek her zaman değil, sadece int ler yapılması gereken bu olurdu) (biraz klunky) bir çözüme sahiptir ve bize, kök nedeninin WCF'nin zayıf (yanlış anlaşılır) WSDL'leri ürettiğine dair bilgi vermesi - gerçekten ihtiyaç duymayan elemanlar üzerinde minOccurs="0" var. Web Referansları, bunu olduğu gibi okur ve başa çıkmak için klunky kodu üretir. Sen adı boşluk (Hizmet Referans olarak içe

[ServiceContract] 
public interface IMData 
{ 
    [OperationContract] 
    MyInt ReturnAnInt(); 

    [OperationContract] 
    String HelloWorld(); 
} 
public class Service1 : IMData 
{ 
    public MyInt ReturnAnInt() 
    { 
     return 4; 
    } 

    public string HelloWorld() 
    { 
     return "Hello World"; 
    } 
} 
+0

WCF gerçekten 'Başkanlığı'nca parametreleri destekliyor mu? – abatishchev

+0

Evet, ama soru tam olarak bu değil. Soruda anlatılan problem, WCF C# kodunun 'out' parametrelerini veya isteğe bağlı 'ın' belirtmediğidir, ancak Web References kod üretecinin bu şekilde oluşturduğu yoldur. Bu çalışıyor. Ancak, bir intrc hizmetini "int ReturnAnInt (out int otherInt);" gibi çalıştırabilir ve bu hem Hizmet Başvurusu hem de Web Başvurusu olarak erişilebilir. Oluşturulan WSDL, birden çok öğeye sahip bir yanıt nesnesidir, bu nedenle diğer istemci dillerinde de kullanılabilir bir şey üretmelidir. –

+0

Yanıtlarınız için hepinize teşekkür ederiz, çok yardımcı oldular! Servis Referansı olarak ithal ettim ve problemim çözüldü :) –

2

: Yöntemin dönüş türünü değiştirerek yanısıra

[MessageContract(IsWrapped = false)] 
public class MyInt 
{ 
    [MessageBodyMember] 
    public int Result { get; set; } 

    public static implicit operator MyInt(int i) 
    { 
     return new MyInt { Result = i }; 
    } 

    public static implicit operator int(MyInt m) 
    { 
     return m.Result; 
    } 
} 

: yazısında dayanarak, bunun yerine bir int bu tür döndürebilir MData) yerine Web Referansı. Kodunuzdaki yanlış bir şey yok

Ve aşağıdaki kodu kullanabilirsiniz

,

MDataClient m = new MDataClient(); 
String helloWorld = m.HelloWorld(); 
int result = m.ReturnAnInt(); 

. Hizmet Başvurusu ekleyip yukarıdaki snippet'i kullanırsanız iyi çalışır.

0

Benzer bir sorunla karşılaştım, web hizmetimin çalışması için bir out int parametresi bulamadım. Bunun tam olarak ne olduğundan emin değilim, ancak string'u out parametresiyle çalıştım. istemci tarafında

s_uId = uId.ToString(); 

: web hizmeti tarafında

[OperationContract] 
LoginStatus GetLogin(string username, string password, out string s_uId); 

int uId; 
string s_uId; 
result = client.GetLogin(username, password, out s_uId); 
Int32.TryParse(s_uId, out uId);