Aracılığıyla paylaş


Windows Communication Foundation (WCF) Web Hizmeti Kullanma

WCF, Microsoft'un hizmet odaklı uygulamalar oluşturmaya yönelik birleşik çerçevesidir. Geliştiricilerin güvenli, güvenilir, işlem yapılmış ve birlikte çalışabilen dağıtılmış uygulamalar oluşturmasını sağlar. Bu makalede, bir uygulamadan WCF Basit Nesne Erişim Protokolü (SOAP) hizmetinin nasıl tükettiği gösterilmektedir Xamarin.Forms .

WCF, aşağıdakiler dahil olmak üzere çeşitli sözleşmelere sahip bir hizmeti açıklar:

  • Veri sözleşmeleri – bir iletideki içeriğin temelini oluşturan veri yapılarını tanımlayın.
  • İleti sözleşmeleri – Mevcut veri sözleşmelerinden iletiler oluşturma.
  • Hata sözleşmeleri – özel SOAP hatalarının belirtilmesine izin verir.
  • Hizmet sözleşmeleri – hizmetlerin desteklediği işlemleri ve her işlemle etkileşim için gereken iletileri belirtin. Ayrıca, her hizmet üzerindeki işlemlerle ilişkilendirilebilen özel hata davranışlarını da belirtir.

ASP.NET Web Hizmetleri (ASMX) ile WCF arasında farklar vardır, ancak WCF, ASMX'in sağladığı özellikleri (HTTP üzerinden SOAP iletileri) destekler. ASMX hizmetini kullanma hakkında daha fazla bilgi için bkz . ASP.NET Web Hizmetlerini (ASMX) kullanma.

Önemli

WCF için Xamarin platform desteği, sınıfını kullanan HTTP/HTTPS üzerinden metin kodlanmış SOAP iletileriyle BasicHttpBinding sınırlıdır.

WCF desteği, ara sunucuyu oluşturmak ve TodoWCFService'i barındırmak için yalnızca Bir Windows ortamında kullanılabilen araçların kullanılmasını gerektirir. iOS uygulamasını derlemek ve test etmek için TodoWCFService'in bir Windows bilgisayara veya Azure web hizmeti olarak dağıtılması gerekir.

Xamarin Forms yerel uygulamaları genellikle .NET Standart Sınıf Kitaplığı ile kod paylaşır. Ancak .NET Core şu anda WCF'yi desteklemediğinden 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 yapma.

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

Örnek Uygulama

Not

iOS 9 ve üzeri cihazlarda, App Transport Security (ATS), İnternet kaynakları (uygulamanın arka uç sunucusu gibi) ile uygulama arasında güvenli bağlantılar zorlayarak hassas bilgilerin yanlışlıkla açıklanmasını önler. iOS 9 için oluşturulan uygulamalarda ATS varsayılan olarak etkinleştirildiğinden, tüm bağlantılar ATS güvenlik gereksinimlerine tabi olacaktır. Bağlantılar bu gereksinimleri karşılamıyorsa, bir özel durumla başarısız olur.

İnternet kaynakları için protokolün ve güvenli iletişimin HTTPS kullanılması mümkün değilse ATS devre dışı bırakılabilir. 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 kullanma

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

Operasyon Açıklama Parametreler
GetTodoItems Yapılacaklar öğelerinin listesini alma
CreateTodoItem Yeni yapılacaklar öğesi oluşturma XML serileştirilmiş TodoItem
EditTodoItem Yapılacaklar öğesini güncelleştirme XML serileştirilmiş TodoItem
DeleteTodoItem Yapılacaklar öğesini silme XML serileştirilmiş TodoItem

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

Uygulamanın hizmete bağlanmasına olanak tanıyan bir WCF hizmeti kullanmak için bir ara sunucu oluşturulmalıdır. Proxy, yöntemleri ve ilişkili hizmet yapılandırmasını tanımlayan hizmet meta verileri kullanılarak oluşturulur. Bu meta veriler, web hizmeti tarafından oluşturulan bir Web Hizmetleri Açıklama Dili (WSDL) belgesi biçiminde kullanıma sunulur. Proxy, .NET Standard kitaplığına web hizmeti için bir hizmet başvurusu eklemek üzere Visual Studio 2017'deki Microsoft WCF Web Hizmeti Başvuru Sağlayıcısı kullanılarak oluşturulabilir. Visual Studio 2017'de Microsoft WCF Web Hizmeti Başvuru Sağlayıcısı'nı kullanarak ara sunucu oluşturmanın bir alternatifi, ServiceModel Meta Veri Yardımcı Programı Aracı'nı (svcutil.exe) kullanmaktır. Daha fazla bilgi için bkz. ServiceModel Meta Veri Yardımcı Programı Aracı (Svcutil.exe).

Oluşturulan ara sunucu sınıfları, Zaman Uyumsuz Programlama Modeli (APM) tasarım desenini kullanan web hizmetlerini kullanmaya yönelik yöntemler sağlar. Bu düzende, zaman uyumsuz bir işlem BeginOperationName ve EndOperationName adlı, zaman uyumsuz işlemi başlatan ve sonlandıran iki yöntem olarak uygulanır.

BeginOperationName yöntemi zaman uyumsuz işlemi başlatır ve arabirimini uygulayan IAsyncResult bir nesne döndürür. BeginOperationName çağrıldıktan sonra, zaman uyumsuz işlem bir iş parçacığı havuzu iş parçacığında gerçekleşirken, bir uygulama çağıran iş parçacığında yönergeleri yürütmeye devam edebilir.

BeginOperationName çağrısının her biri için, uygulamanın işlemin sonuçlarını almak için EndOperationName'i de çağırması gerekir. EndOperationName değerinin dönüş değeri, zaman uyumlu web hizmeti yöntemi tarafından döndürülen türle aynıdır. Örneğin, EndGetTodoItems yöntemi 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 örneğe ayarlanması gereken bir IAsyncResult parametre de içerir.

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

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

TodoServiceClient nesnesini oluşturma

Oluşturulan proxy sınıfı, HTTP üzerinden WCF hizmetiyle iletişim kurmak için kullanılan sınıfını sağlar TodoServiceClient . URI tarafından tanımlanan bir hizmet örneğinden zaman uyumsuz işlemler olarak web hizmeti yöntemlerini çağırmak için işlevsellik sağlar. Zaman uyumsuz işlemler hakkında daha fazla bilgi için bkz . Zaman Uyumsuz Desteğe Genel Bakış.

Örnek TodoServiceClient , aşağıdaki kod örneğinde gösterildiği gibi uygulamanın WCF hizmetini tüketmesi gerektiği sürece nesnenin yaşaması için sınıf düzeyinde bildirilir:

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, uygulamaların ve hizmetlerin birbiriyle 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önderileceğini belirtir. Uç nokta adresi belirtmek, uygulamanın birden çok yayımlanmış örnek olması koşuluyla WCF hizmetinin farklı örneklerine bağlanmasına olanak tanır.

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

Veri aktarımı nesneleri oluşturma

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

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 TodoWCFService.TodoItem bir örnek oluşturur ve her özelliği örnekten aynı özelliğe TodoItem ayarlar.

Benzer şekilde, veriler web hizmetinden alındığında, ara sunucu tarafından oluşturulan TodoItem türden bir TodoItem örneğe dönüştürülmelidir. Bu, aşağıdaki kod örneğinde gösterildiği gibi yöntemiyle FromWCFServiceTodoItem gerçekleştirilir:

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 ara sunucu tarafından oluşturulan TodoItem türden verileri alır ve yeni oluşturulan TodoItem örnekte ayarlar.

Veri alma

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

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

Task.Factory.FromAsync yöntemi, null yöntem tamamlandıktan sonra TodoServiceClient.BeginGetTodoItems yöntemini yürüten TodoServiceClient.EndGetTodoItems bir Task oluşturur ve parametresi temsilciye BeginGetTodoItems veri geçirilmediğini belirtir. Son olarak, numaralandırmanın TaskCreationOptions değeri, görevlerin oluşturulması ve yürütülmesi için varsayılan davranışın kullanılması gerektiğini belirtir.

TodoServiceClient.EndGetTodoItems yöntemi örneklerden birini ObservableCollectionTodoWCFService.TodoItem döndürür ve daha sonra görüntülenmek üzere örneklerden birine ListTodoItem dönüştürülür.

Veri oluşturma

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

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

Task.Factory.FromAsync yöntemi, todoItem yöntem tamamlandıktan sonra TodoServiceClient.BeginCreateTodoItem yöntemini yürüten TodoServiceClient.EndCreateTodoItem bir Task oluşturur ve parametresi, web hizmeti tarafından oluşturulacak öğesini belirtmek TodoItem için temsilciye BeginCreateTodoItem geçirilen verilerdir. Son olarak, numaralandırmanın TaskCreationOptions değeri, görevlerin oluşturulması ve yürütülmesi için varsayılan davranışın kullanılması gerektiğini belirtir.

Web hizmeti, uygulama tarafından işlenen öğesini oluşturamazsa TodoItembir FaultException oluşturur.

Verileri güncelleştirme

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

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

Task.Factory.FromAsync yöntemi, todoItem yöntem tamamlandıktan sonra TodoServiceClient.BeginCreateTodoItem yöntemini yürüten TodoServiceClient.EndEditTodoItem bir Task oluşturur ve parametresi, web hizmeti tarafından güncelleştirilecek öğesini belirtmek TodoItem için temsilciye BeginEditTodoItem geçirilen verilerdir. Son olarak, numaralandırmanın TaskCreationOptions değeri, görevlerin oluşturulması ve yürütülmesi için varsayılan davranışın kullanılması gerektiğini belirtir.

Web hizmeti, uygulama tarafından işlenen öğesini bulamazsa veya güncelleştiremezse TodoItembir FaultException oluşturur.

Veri silme

TodoServiceClient.BeginDeleteTodoItem ve TodoServiceClient.EndDeleteTodoItem yöntemleri, web hizmeti tarafından sağlanan işlemi çağırmak DeleteTodoItem için kullanılır. Bu zaman uyumsuz yöntemler, aşağıdaki kod örneğinde gösterildiği gibi bir Task nesnede kapsüllenir:

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

Task.Factory.FromAsync yöntemi, id yöntem tamamlandıktan sonra TodoServiceClient.BeginDeleteTodoItem yöntemini yürüten TodoServiceClient.EndDeleteTodoItem bir Task oluşturur ve parametresi, web hizmeti tarafından silinecek öğesini belirtmek TodoItem için temsilciye BeginDeleteTodoItem geçirilen verilerdir. Son olarak, numaralandırmanın TaskCreationOptions değeri, görevlerin oluşturulması ve yürütülmesi için varsayılan davranışın kullanılması gerektiğini belirtir.

Web hizmeti, uygulama tarafından işlenen öğesini bulamazsa veya silemezse TodoItembir FaultException oluşturur.

IIS Express'e uzaktan erişimi yapılandırma

Visual Studio 2017 veya Visual Studio 2019'da UWP uygulamasını ek yapılandırma içermeyen bir bilgisayarda test edebilmeniz gerekir. Android ve iOS istemcilerini test etme, bu bölümdeki ek adımları gerektirebilir. Daha fazla bilgi için bkz. iOS Simülatörleri ve Android Öykünücüleri'nden Yerel Web Hizmetlerine Bağlan.

Varsayılan olarak, IIS Express yalnızca isteklerine localhostyanıt verir. Uzak cihazların (Android cihazı, i Telefon veya simülatör gibi) yerel WCF hizmetinize erişimi olmaz. Yerel ağdaki Windows 10 iş istasyonu IP adresinizi bilmeniz gerekir. Bu örnekte iş istasyonunuzun IP adresine 192.168.1.143sahip olduğunu varsayalım. Aşağıdaki adımlar, Windows 10 ve IIS Express'i uzak bağlantıları kabul etmek ve fiziksel veya sanal bir cihazdan hizmete bağlanmak için yapılandırmayı açıklar:

  1. Windows Güvenlik Duvarı'na bir özel durum ekleyin. Alt ağınızdaki uygulamaların WCF hizmetiyle iletişim kurmak için kullanabileceği bir bağlantı noktasını Windows Güvenlik Duvarı aracılığıyla açmanız gerekir. Güvenlik duvarında 49393 numaralı bağlantı noktasını açan bir gelen kuralı oluşturun. Yönetici 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'i Uzak bağlantıları kabul etmek için yapılandırın. IIS Express yapılandırma dosyasını [solution directory].vs\config\applicationhost.config konumunda düzenleyerek IIS Express'i yapılandırabilirsiniz. site adlı TodoWCFServiceöğesini bulun. Aşağıdaki XML'e benzer 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" />
        </bindings>
    </site>
    

    49393 numaralı bağlantı noktasını dış trafiğe ve Android öykünücüsuna açmak için iki binding öğe eklemeniz gerekir. Bağlama, IIS Express'in isteklere nasıl yanıt vereceğini belirten bir [IP address]:[port]:[hostname] biçim kullanır. Dış istekler, olarak bindingbelirtilmesi gereken konak adlarına sahip olur. ÖĞESINE aşağıdaki XML'yi bindings ekleyin ve IP adresini kendi IP adresinizle değiştirin:

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

    Değişikliklerinizden bindings sonra öğ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

    Varsayılan olarak, IIS Express güvenlik nedeniyle dış kaynaklardan gelen bağlantıları kabul etmez. Uzak cihazlardan bağlantıları etkinleştirmek için IIS Express'i Yönetici istrative izinlerle çalıştırmanız gerekir. Bunu yapmanın en kolay yolu Visual Studio 2017'yi Yönetici istrative izinlerle çalıştırmaktır. Bu, TodoWCFService'i çalıştırırken Yönetici istrative izinlerle IIS Express'i başlatır.

    Bu adımlar tamamlandığında, TodoWCFService'i çalıştırabilmeniz ve alt ağınızdaki diğer cihazlardan bağlanabilmeniz gerekir. Uygulamanızı çalıştırıp adresini ziyaret ederek http://localhost:49393/TodoService.svcbunu test edebilirsiniz. Bu URL'yi ziyaret ederken Hatalı İstek hatası alırsanız, bindings IIS Express yapılandırmasında hatalı olabilirsiniz (istek IIS Express'e ulaşıyor 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'in hizmeti çalıştırmaya ve hizmete sunmasına izin vermek için, Proje Özellikleri Web Hata Ayıklayıcıları'nda Düzenle ve Devam Et seçeneğini kapatın.>>

  3. Cihazların hizmete erişmek için kullandığı uç noktayı özelleştirin. Bu adım, WCF hizmetine erişmek için fiziksel veya öykünmüş bir cihazda çalışan istemci uygulamasını yapılandırmayı içerir.

    Android öykünücüsü, öykünücünün konak makinenin localhost adresine doğrudan erişmesini engelleyen bir iç ara sunucu kullanır. Bunun yerine, öykünücüdeki adres 10.0.2.2 bir iç ara sunucu aracılığıyla konak makinede adresine localhost yönlendirilir. Bu proksied istekler, istek üst bilgisinde ana bilgisayar adı olarak yer 127.0.0.1 alır. Bu nedenle yukarıdaki adımlarda bu konak adı için IIS Express bağlamasını oluşturdunuz.

    Windows için Uzak iOS Simülatörü'nü kullanıyor olsanız bile, iOS Simülatörü bir Mac derleme konağı üzerinde çalışır. Simülatörden gelen ağ isteklerinde ana bilgisayar adı olarak yerel ağda iş istasyonu IP'niz bulunur (bu örnekte 192.168.1.143adıdır, ancak gerçek IP adresiniz büyük olasılıkla farklı olacaktır). Bu nedenle yukarıdaki adımlarda bu konak adı için IIS Express bağlamasını oluşturdunuz.

    SoapUrl TodoWCF (Taşınabilir) projesindeki Constants.cs dosyasındaki özelliğin ağınız için doğru 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;
        }
    }
    

    Constants.cs uygun uç noktalarla yapılandırdıktan sonra, fiziksel veya sanal cihazlardan Windows 10 iş istasyonunuzda çalışan TodoWCFService'e bağlanabilmeniz gerekir.