Bir Windows Communication Foundation (WCF) Web Hizmetini Tüketme

Örneği İndir Örneği indirme

WCF, Microsoft'un hizmet odaklı uygulamalar için birleşik çerçevesidir. Geliştiricilerin güvenli, güvenilir, işlemden değiştirilebilir ve birlikte çalışabilen dağıtılmış uygulamalar oluşturmalarını sağlar. Bu makalede, bir uygulamanın WCF Basit Nesne Erişim Protokolü (SOAP) hizmetinin nasıl tüketilmesi Xamarin.Forms açıklanmıştır.

WCF, aşağıdakiler dahil olmak üzere çeşitli anlaşmalara sahip bir hizmeti açıklar:

  • Veri sözleşmeleri: bir ileti içindeki içeriğin temelini oluşturmak için veri yapılarını tanımlar.
  • İleti sözleşmeleri: Mevcut veri sözleşmelerinden iletiler oluşturma.
  • Hata anlaşmaları – özel SOAP hatalarına izin verme.
  • Hizmet sözleşmeleri: Hizmetlerin destekleyeni işlemleri ve her bir işlemle etkileşim kurmak için gereken iletileri belirtin. Ayrıca her hizmetteki işlemlerle ilişkilendirilen özel hata davranışlarını da belirtir.

Web Hizmetleri (ASMX) ASP.NET WCF arasında farklar vardır, ancak WCF, ASMX tarafından http üzerinden SOAP iletileri ile aynı özellikleri destekler. ASMX hizmetini tüketme hakkında daha fazla bilgi için bkz. ASP.NET Web Hizmetleri (ASMX) 'i tüketme.

Önemli

WCF için Xamarin platformu desteği, sınıfı kullanılarak HTTP/HTTPS üzerinden metin kodlamalı SOAP iletileriyle BasicHttpBinding sınırlıdır.

WCF desteği, ara sunucu oluşturmak ve TodoWCFService'i barındırmak için Windows ortamda kullanılabilen araçların kullanımını gerektirir. iOS uygulamasını oluşturma ve test etme için TodoWCFService'in bir Windows veya Azure web hizmeti olarak dağıtımı gerekir.

Xamarin Forms yerel uygulamalar genellikle bir .NET Standard Sınıf Kitaplığı ile kod paylaşır. Ancak, .NET Core şu anda WCF'yi desteklemez, bu nedenle paylaşılan projenin eski bir Taşınabilir Sınıf Kitaplığı olması gerekir. .NET Core'da WCF desteği hakkında bilgi için bkz. Sunucu uygulamaları için .NET Core ile .NET Framework arasında seçim.

Örnek uygulama çözümü, yerel olarak çalıştırılabilir ve aşağıdaki ekran görüntüsünde gösterilen bir WCF hizmeti içerir:

Örnek Uygulama

Not

iOS 9 ve üzerinde, Uygulama Aktarım Güvenliği (ATS), İnternet kaynakları (uygulamanın arka uç sunucusu gibi) ile uygulama arasında güvenli bağlantılar zorlar ve böylece hassas bilgilerin yanlışlıkla açığa çıkması önlenebilir. ATS, iOS 9 için yerleşik uygulamalarda varsayılan olarak etkinleştirildiğinden, tüm bağlantılar ATS güvenlik gereksinimlerine tabi olur. Bağlantılar bu gereksinimleri karşılamıyorsa özel durumla başarısız olur.

İNTERNET kaynakları için protokolün ve güvenli iletişimin kullanılamaysa ATS HTTPS bu seçeneğin dışında tutulabilirsiniz. Bu, uygulamanın Info.plist dosyası güncelleştirilerek elde edilebilir. Daha fazla bilgi için bkz. Uygulama Aktarım Güvenliği.

Web hizmetini tüketme

WCF hizmeti aşağıdaki işlemleri sağlar:

İşlem Description Parametreler
GetTodoItems Yapacak öğelerin listesini al
CreateTodoItem Yeni bir to-do öğesi oluşturma Serileştirilmiş bir XML TodoItem
EditTodoItem Bir to-do öğesini güncelleştirme Serileştirilmiş bir XML TodoItem
DeleteTodoItem Bir to-do öğesini silme Serileştirilmiş bir XML TodoItem

Uygulamada kullanılan veri modeli hakkında daha fazla bilgi için bkz. Verileri modelleme.

Uygulamanın hizmete bağlanmasına olanak sağlayan bir WCF hizmetini tüketmek için bir ara sunucu oluşturulmaktadır. Ara sunucu, yöntemleri ve ilişkili hizmet yapılandırmasını tanımlayan hizmet meta verileri tüketerek oluşturulur. Bu meta veriler, web hizmeti tarafından oluşturulan bir Web Hizmetleri Açıklama Dili (WSDL) belgesi şeklinde açığa çıkar. Ara sunucu, web hizmeti için Microsoft WCF Web Service Reference Provider bir hizmet başvurusu eklemek Visual Studio 2017'de .NET Standard kullanılarak .NET Standard. Visual Studio 2017'de Microsoft WCF Web Service Reference Provider kullanarak ara sunucu oluşturmaya alternatif olarak ServiceModel Meta Veri Yardımcı Programı Aracı'nı (svcutil.exe). Daha fazla bilgi için bkz. ServiceModel Metadata Utility Tool (Svcutil.exe).

Oluşturulan proxy sınıfları, Zaman Uyumsuz Programlama Modeli (APM) tasarım desenini kullanan web hizmetlerini tüketmek için yöntemler sağlar. Bu düzende, zaman uyumsuz bir işlem, zaman uyumsuz işlemi başlatan ve bitiren BeginOperationName ve EndOperationNameadlı iki yöntem olarak uygulanır.

BeginOperationName yöntemi zaman uyumsuz işlemi başlar ve arabirimi uygulayan bir nesne döndürür. BeginOperationName çağrısındabulunduktan sonra, bir uygulama, bir iş parçacığı havuzu iş parçacığında zaman uyumsuz işlem yapılırken, çağıran iş parçacığında yönergeleri yürütmeye devam eder.

BeginOperationNameçağrısı için, uygulamanın işlem sonuçlarını almak için EndOperationName çağrısı da gerekir. EndOperationName dönüş değeri, zaman uyumlu web hizmeti yöntemi tarafından döndürülen türle aynıdır. Örneğin yöntemi EndGetTodoItems bir örnek koleksiyonu TodoItem döndürür. EndOperationName yöntemi, BeginOperationName yöntemine karşılık gelen çağrı tarafından döndürülen örnek için ayarlanacak bir parametre de içerir.

Görev Paralel Kitaplığı (TPL), aynı nesnedeki zaman uyumsuz işlemleri kapsülleerek bir APM başlangıç/bitiş yöntem çiftini tüketma işlemini Task basitleştirebilir. Bu kapsülleme yöntemin birden çok aşırı yüklemesi tarafından TaskFactory.FromAsync sağlanır.

APM hakkında daha fazla bilgi için MSDN'de Zaman Uyumsuz Programlama Modeli ve TPL ve Geleneksel .NET Framework Zaman Uyumsuz Programlama konusuna bakın.

TodoServiceClient nesnesini oluşturma

Oluşturulan proxy TodoServiceClient sınıfı, HTTP üzerinden WCF hizmetiyle iletişim kurmak için kullanılan sınıfını sağlar. Web hizmeti yöntemlerini tanımlanan bir URI'den zaman uyumsuz işlemler olarak faturalamaya yönelik işlevsellik sağlar. Zaman uyumsuz işlemler hakkında daha fazla bilgi için bkz. Async Desteğine Genel Bakış.

Örnek, aşağıdaki kod örneğinde gösterildiği gibi, uygulamanın WCF hizmetini tüketmesi gereken sürece nesnenin yaşam süresi boyunca devam etmek için sınıf TodoServiceClient düzeyinde bildirilmesidir:

public class SoapService : ISoapService
{
  ITodoService todoService;
  ...

  public SoapService ()
  {
    todoService = new TodoServiceClient (
      new BasicHttpBinding (),
      new EndpointAddress (Constants.SoapUrl));
  }
  ...
}

Örnek TodoServiceClient bağlama bilgileri ve bir uç nokta adresi ile yapılandırılır. Bağlama, uygulama ve hizmetlerin birbirleriyle iletişim kurması için gereken aktarım, kodlama ve protokol ayrıntılarını belirtmek için kullanılır. BasicHttpBinding, metin kodlu SOAP iletilerinin HTTP aktarım protokolü üzerinden gönder olacağını belirtir. Bir uç nokta adresi belirtmek, birden çok yayımlanmış örnek olduğu şartıyla uygulamanın WCF hizmetinin farklı örneklerine bağlanmasına olanak sağlar.

Hizmet başvurularını yapılandırma hakkında daha fazla bilgi için bkz. Hizmet Başvurularını Yapılandırma.

Veri aktarımı nesneleri oluşturma

Örnek uygulama, verileri TodoItem modellemek için sınıfını kullanır. Bir öğeyi TodoItem web hizmetine depolamak için önce ara sunucu tarafından oluşturulan türe TodoItem dönüştürülmesi gerekir. Bu, aşağıdaki kod ToWCFServiceTodoItem örneğinde gösterildiği gibi yöntemiyle başarılı olur:

TodoWCFService.TodoItem ToWCFServiceTodoItem (TodoItem item)
{
  return new TodoWCFService.TodoItem
  {
    ID = item.ID,
    Name = item.Name,
    Notes = item.Notes,
    Done = item.Done
  };
}

Bu yöntem yalnızca yeni bir TodoWCFService.TodoItem örnek oluşturur ve her özelliği örnekteki aynı özellik olarak TodoItem ayarlar.

Benzer şekilde, veriler web hizmetlerinden alınarak ara sunucu tarafından oluşturulan türden bir TodoItem örneğine TodoItem dönüştürülmesi gerekir. Bu, aşağıdaki kod FromWCFServiceTodoItem örneğinde gösterildiği gibi yöntemiyle başarılı olur:

static TodoItem FromWCFServiceTodoItem (TodoWCFService.TodoItem item)
{
  return new TodoItem
  {
    ID = item.ID,
    Name = item.Name,
    Notes = item.Notes,
    Done = item.Done
  };
}

Bu yöntem yalnızca proxy tarafından oluşturulan türden verileri TodoItem almak ve yeni oluşturulan örnekte TodoItem ayarlar.

Veri alma

web TodoServiceClient.BeginGetTodoItemsTodoServiceClient.EndGetTodoItems hizmeti tarafından sağlanan işlemi GetTodoItems çağıran ve yöntemleri kullanılır. Bu zaman uyumsuz yöntemler, aşağıdaki kod örneğinde gösterildiği gibi Task bir nesnesinde kapsüllendi:

public async Task<List<TodoItem>> RefreshDataAsync ()
{
  ...
  var todoItems = await Task.Factory.FromAsync <ObservableCollection<TodoWCFService.TodoItem>> (
    todoService.BeginGetTodoItems,
    todoService.EndGetTodoItems,
    null,
    TaskCreationOptions.None);

  foreach (var item in todoItems)
  {
    Items.Add (FromWCFServiceTodoItem (item));
  }
  ...
}

yöntemi, yöntem tamamlandıktan sonra yöntemini yürüten bir oluşturur ve parametresi temsilciye veri Task.Factory.FromAsyncTaskTodoServiceClient.EndGetTodoItemsTodoServiceClient.BeginGetTodoItemsnull geçirilmez. BeginGetTodoItems Son olarak, numaralama değeri görevlerin oluşturulması ve yürütülmesi TaskCreationOptions için varsayılan davranışın kullanılmalıdır belirtir.

yöntemi TodoServiceClient.EndGetTodoItemsObservableCollection örneklerin TodoWCFService.TodoItem bir döndürür, daha sonra görüntülemek için ListTodoItem örneklerin bir dönüştürülür.

Veri oluşturma

web TodoServiceClient.BeginCreateTodoItemTodoServiceClient.EndCreateTodoItem hizmeti tarafından sağlanan işlemi CreateTodoItem çağıran ve yöntemleri kullanılır. Bu zaman uyumsuz yöntemler, aşağıdaki kod örneğinde gösterildiği gibi Task bir nesnesinde kapsüllendi:

public async Task SaveTodoItemAsync (TodoItem item, bool isNewItem = false)
{
  ...
  var todoItem = ToWCFServiceTodoItem (item);
  ...
  await Task.Factory.FromAsync (
    todoService.BeginCreateTodoItem,
    todoService.EndCreateTodoItem,
    todoItem,
    TaskCreationOptions.None);
  ...
}

yöntemi, yöntemi tamamlandıktan sonra yöntemini yürüten bir oluşturur ve parametresi, web hizmeti tarafından oluşturulacak değeri belirtmek için temsilciye Task.Factory.FromAsyncTask geçirilen TodoServiceClient.EndCreateTodoItemTodoServiceClient.BeginCreateTodoItemtodoItemBeginCreateTodoItemTodoItem verilerdir. Son olarak, numaralama değeri görevlerin oluşturulması ve yürütülmesi TaskCreationOptions için varsayılan davranışın kullanılmalıdır belirtir.

Web hizmeti, uygulama FaultException tarafından işilen oluşturma işlemi TodoItem başarısız olursa bir oluşturur.

Verileri güncelleştirme

web TodoServiceClient.BeginEditTodoItemTodoServiceClient.EndEditTodoItem hizmeti tarafından sağlanan işlemi EditTodoItem çağıran ve yöntemleri kullanılır. Bu zaman uyumsuz yöntemler, aşağıdaki kod örneğinde gösterildiği gibi Task bir nesnesinde kapsüllendi:

public async Task SaveTodoItemAsync (TodoItem item, bool isNewItem = false)
{
  ...
  var todoItem = ToWCFServiceTodoItem (item);
  ...
  await Task.Factory.FromAsync (
    todoService.BeginEditTodoItem,
    todoService.EndEditTodoItem,
    todoItem,
    TaskCreationOptions.None);
  ...
}

yöntemi, yöntemi tamamlandıktan sonra yöntemini yürüten bir oluşturur ve parametresi, web hizmeti tarafından güncelleştirilen 'i belirtmek için temsilciye Task.Factory.FromAsyncTask geçirilen TodoServiceClient.EndEditTodoItemTodoServiceClient.BeginCreateTodoItemtodoItemBeginEditTodoItemTodoItem verilerdir. Son olarak, numaralama değeri görevlerin oluşturulması ve yürütülmesi TaskCreationOptions için varsayılan davranışın kullanılmalıdır belirtir.

Web hizmeti, FaultExceptionTodoItem uygulama tarafından işlenen öğesini bulamazsa veya güncelleştiremediğinde bir oluşturur.

Verileri silme

TodoServiceClient.BeginDeleteTodoItemVe TodoServiceClient.EndDeleteTodoItem yöntemleri, DeleteTodoItem Web hizmeti tarafından sunulan işlemi çağırmak için kullanılır. Aşağıdaki kod örneğinde gösterildiği gibi bu zaman uyumsuz yöntemler bir nesne içinde kapsüllenir Task :

public async Task DeleteTodoItemAsync (string id)
{
  ...
  await Task.Factory.FromAsync (
    todoService.BeginDeleteTodoItem,
    todoService.EndDeleteTodoItem,
    id,
    TaskCreationOptions.None);
  ...
}

Yöntemi, yöntemi Task.Factory.FromAsyncTask tamamlandıktan sonra yöntemi yürüten, TodoServiceClient.EndDeleteTodoItemTodoServiceClient.BeginDeleteTodoItemidBeginDeleteTodoItemTodoItem Web hizmeti tarafından silinecek öğesini belirtmek için temsilciye geçirilen veriler olan bir oluşturur. Son olarak, numaralandırmanın değeri, TaskCreationOptions görevlerin oluşturulması ve yürütülmesi için varsayılan davranışın kullanılması gerektiğini belirtir.

Web hizmeti, FaultExceptionTodoItem uygulama tarafından işlenen öğesini bulmazsa veya silemeirse bir oluşturur.

IIS Express uzaktan erişimi yapılandırma

Visual Studio 2017 veya Visual Studio 2019 ' de, UWP uygulamasını ek yapılandırma olmadan bir bilgisayarda test edebilmelisiniz. Android ve iOS istemcilerini test etmek bu bölümde ek adımlar gerektirebilir. daha fazla bilgi için bkz. iOS simülatörleri ve Android öykünücülerinden yerel Web hizmetlerine Bağlan .

varsayılan olarak, IIS Express yalnızca öğesine isteklerine yanıt verir localhost . uzak cihazların (örneğin, bir Android cihaz, iPhone veya benzetici) yerel WCF hizmetinize erişimi olmayacaktır. yerel ağda Windows 10 iş istasyonu ıp adresini bilmeniz gerekecektir. Bu örneğin amacı için, iş istasyonunuzun IP adresine sahip olduğunu varsayalım 192.168.1.143 . aşağıdaki adımlarda Windows 10 ve IIS Express uzak bağlantıları kabul etmek ve hizmete fiziksel veya sanal cihazdan bağlanmak üzere nasıl yapılandırılacağı açıklanmaktadır:

  1. Windows güvenlik duvarı için bir özel durum ekleyin. alt ağınızdaki uygulamaların WCF hizmetiyle iletişim kurmak için kullanabileceği Windows güvenlik duvarı aracılığıyla bir bağlantı noktası açmanız gerekir. Güvenlik duvarında 49393 numaralı bağlantı noktasını açan bir gelen kuralı oluşturun. Bir yönetim komut isteminden şu komutu çalıştırın:

    netsh advfirewall firewall add rule name="TodoWCFService" dir=in protocol=tcp localport=49393 profile=private remoteip=localsubnet action=allow
    
  2. IIS Express uzak bağlantıları kabul edecek şekilde yapılandırın. yapılandırma dosyasını [çözüm dizini] konumundaki IIS Express düzenleyerek IIS Express yapılandırabilirsiniz. vs\config\applicationhost.config. Adına sahip öğeyi bulun TodoWCFService . Aşağıdaki XML 'e benzer olmalıdır:

    <site name="TodoWCFService" id="2">
        <application path="/" applicationPool="Clr4IntegratedAppPool">
            <virtualDirectory path="/" physicalPath="C:\Users\tom\TodoWCF\TodoWCFService\TodoWCFService" />
        </application>
        <bindings>
            <binding protocol="http" bindingInformation="*:49393:localhost" />
        </bindings>
    </site>
    

    bindingDış trafik ve Android öykünücüsü 49393 bağlantı noktasını açmak için iki öğe eklemeniz gerekir. bağlama, [IP address]:[port]:[hostname] IIS Express isteklere nasıl yanıt vereceğini belirten bir biçim kullanır. Dış isteklerin, olarak belirtilmesi gereken ana bilgisayar adları vardır binding . Aşağıdaki XML bindings öğesini, IP adresini kendı IP adresinizle değiştirerek öğesine ekleyin:

    <binding protocol="http" bindingInformation="*:49393:192.168.1.143" />
    <binding protocol="http" bindingInformation="*:49393:127.0.0.1" />
    

    Değişikliklerinizi yaptıktan sonra bindings öğesi aşağıdaki gibi görünmelidir:

    <site name="TodoWCFService" id="2">
        <application path="/" applicationPool="Clr4IntegratedAppPool">
            <virtualDirectory path="/" physicalPath="C:\Users\tom\TodoWCF\TodoWCFService\TodoWCFService" />
        </application>
        <bindings>
            <binding protocol="http" bindingInformation="*:49393:localhost" />
            <binding protocol="http" bindingInformation="*:49393:192.168.1.143" />
            <binding protocol="http" bindingInformation="*:49393:127.0.0.1" />
        </bindings>
    </site>
    

    Önemli

    IIS Express, varsayılan olarak, güvenlik nedenleriyle dış kaynaklardaki bağlantıları kabul etmez. uzak cihazlardan gelen bağlantıları etkinleştirmek için IIS Express yönetici izinleriyle çalıştırmanız gerekir. bunu yapmanın en kolay yolu, yönetici izinleriyle Visual Studio 2017 ' i çalıştırmalıdır. bu işlem, todowcfservice çalıştırırken yönetici izinleriyle IIS Express başlatacaktır.

    Bu adımlar tamamlandıktan sonra, TodoWCFService ' i çalıştırabilmeniz ve alt ağınızdaki diğer cihazlardan bağlantı kurabilmesi gerekir. Uygulamanızı çalıştırıp ziyaret ederek bunu test edebilirsiniz http://localhost:49393/TodoService.svc . bu URL 'yi ziyaret ederken hatalı bir istek hatası alırsanız, IIS Express yapılandırmasında yanlış olabilir (istek IIS Express ulaştı ancak reddediliyor). Farklı bir hata alırsanız, uygulamanız çalışmıyor veya güvenlik duvarınız yanlış yapılandırılmış olabilir.

    IIS Express çalışmaya devam etmesine ve hizmete hizmet vermeye izin vermek için, Project özellikleri Web hata ayıklayıcıları' nda düzenle ve devam et seçeneğini kapatın.

  3. Hizmetine erişmek için kullanılan uç nokta cihazlarını özelleştirin. Bu adım, WCF hizmetine erişmek için fiziksel veya benzetilmiş bir cihazda çalışan istemci uygulamasını yapılandırmayı içerir.

    Android öykünücüsü, öykünücüsünün konak makinenin adresine doğrudan erişmesini önleyen bir iç ara sunucu kullanır localhost . Bunun yerine, 10.0.2.2 öykünücüdeki adres, localhost iç bir ara sunucu üzerinden ana makine üzerinde yönlendirilir. bu proxy istekleri, 127.0.0.1 yukarıdaki adımlarda bu konak adı için IIS Express bağlamayı oluşturduğunuz için istek üstbilgisinde ana bilgisayar adına sahip olur.

    Windows Için uzak IOS simülatörükullanıyor olsanız bile, IOS simülatörü bir Mac derleme konağında çalışır. Simülatörden gelen ağ istekleri, ana bilgisayar adı olarak yerel ağ üzerinde iş istasyonu IP 'niz olur (Bu örnekte 192.168.1.143 , ancak gerçek IP adresiniz farklı olacaktır). yukarıdaki adımlarda bu konak adı için IIS Express bağlamayı oluşturdunuz.

    SoapUrlTodoWCF (taşınabilir) projesindeki SoapUrl dosyasında özelliğinin ağınız için doğru olan değerlere sahip olduğundan emin olun:

    public static string SoapUrl
    {
        get
        {
            var defaultUrl = "http://localhost:49393/TodoService.svc";
    
            if (Device.RuntimePlatform == Device.Android)
            {
                defaultUrl = "http://10.0.2.2:49393/TodoService.svc";
            }
            else if (Device.RuntimePlatform == Device.iOS)
            {
                defaultUrl = "http://192.168.1.143:49393/TodoService.svc";
            }
    
            return defaultUrl;
        }
    }
    

    sabitleri. cs 'yi uygun uç noktalara yapılandırdıktan sonra, Windows 10 iş istasyonunuzda çalışan todowcfservice 'e fiziksel veya sanal cihazlardan bağlanabilirsiniz.