Web hizmeti erişimi ve "doğrudan" erişim arasında kolayca geçiş yapmak için bir Web Başvurusu (WCF değil) için oluşturulmuş proxy sınıfının ortak bir arabirim uygulayabilmesinin bir yolunu arıyorum. istemci uygulamasında iş katmanı, gibi bir şey:Web Service proxy sınıfı arabirimi uygulamak için
public IBusiness GetBusinessObject()
{
if (_mode = "remote")
return new BusinessWebService.Business(); // access through web service proxy class
else
return new Business(); // direct access
}
Ancak (örneğin aşağıdaki örneklerde CustomSerializableType
) oluşturulan proxy sınıfında başvurulan olmayan özel türleri. Bunun yerine yeni, özdeş türler üretilir, bu da proxy sınıfının arabirimi gerçekleştirmesini imkansız kılar.
Oluşturulan proxy sınıfı başvurusunu bu tür bir şekilde yapmak için bir yol var mı, yoksa tüm bu yanlış mı yapıyorum? Web servisini bunun yerine bir WCF servisine dönüştürmeyi düşünmeli miyim?
Detaylar Çözümümüz bu dört projeden oluşmaktadır
: (veri deposu, iş mantığını içeren kere)
- Bir iş kütüphanesi
CustomSerializableType
) - A web ser
- Yerel modu:
Müşterimiz windows uygulaması iki farklı modda çalıştırmak mümkün isteyen
- bir windows uygulaması yardımcısı (uzaktan müşteriler ve iş katmanı arasında bir proxy gibi davranır) uygulama basitçe erişim verilerine doğrudan uygulama verilerini
Bunu yapmak için, ortak kitaplıkta bulunan ve tüm iş yöntemlerini içeren bir arabirim olan IBusiness'ı yarattık.
Arayüz
public interface IBusiness
{
CustomSerializableType DoSomeWork();
}
İş katmanı
public class Business : IBusiness
{
public CustomSerializableType DoSomeWork()
{
// access data store
}
}
Web hizmeti
public class WebServiceBusiness : IBusiness
{
private Business _business = new Business();
[WebMethod]
public CustomSerializableType DoSomeWork()
{
return _business.DoSomeWork();
}
}
Oluşturulan vekil sınıf müvekkiline varsayılan ad alanı aşağıdaki "Müşteri", web referansı "Proxy" olarak adlandırılır ve bu, o zaman bunu olduğunu varsayarsak (okunabilmesi için dışarı sol kod bir ton)
public partial class Business
: System.Web.Services.Protocols.SoapHttpClientProtocol
{
public CustomSerializableType DoSomeWork()
{
// ...
}
public partial class CustomSerializableType {
// PROBLEM: this new type is referenced, instead of the
// type in the common library
}
}
Vekil sınıflarını oluşturmak için svcutil.exe kullanıyor musunuz? –
Hayır, şu anda sadece Visual Studio 2010 yerleşik araçlarını kullanıyorum. Wsdl.exe ile biraz uğraşmaya çalıştı, ama sorunlarımı çözmedi. Svcutil.exe daha iyi bir alternatif mi? Bu, 'eski' Web Servisleri yerine WCF hizmetlerine yükseltme yapmamı gerektirmez mi? – bernhof