ASP.NET Web hizmeti (ASMX) kullanma

Örnek indir Örneği indirin

ASMX basit nesne erişim Protokolü (SOAP) kullanarak ileti gönderen Web Hizmetleri oluşturma yeteneği sağlar. SOAP, Web hizmetleri oluşturmak ve bunlara erişmek için platformdan bağımsız ve dilden bağımsız bir protokoldür. Bir ASMX hizmetinin tüketicilerinin, hizmeti uygulamak için kullanılan platform, nesne modeli veya programlama dili ile ilgili herhangi bir şeyi bilmeleri gerekmez. Yalnızca SOAP iletilerinin nasıl gönderileceğini ve alınacağını anlamalıdır. Bu makalede, bir uygulamadan bir ASMX SOAP hizmetinin nasıl kullanılacağı gösterilmektedir Xamarin.Forms .

SOAP iletisi, aşağıdaki öğeleri içeren bir XML belgesidir:

  • XML belgesini SOAP iletisi olarak tanımlayan Envelope adlı bir kök öğe.
  • Kimlik doğrulama verileri gibi uygulamaya özgü bilgileri içeren isteğe bağlı bir üstbilgi öğesi. Üstbilgi öğesi mevcutsa, Envelope öğesinin ilk alt öğesi olmalıdır.
  • Alıcı için tasarlanan SOAP iletisini içeren gerekli bir Body öğesi.
  • Hata iletilerini göstermek için kullanılan isteğe bağlı bir hata öğesi. Hata öğesi varsa, gövde öğesinin bir alt öğesi olmalıdır.

SOAP, HTTP, SMTP, TCP ve UDP gibi birçok Aktarım Protokolü üzerinde çalışabilir. Ancak, bir ASMX hizmeti yalnızca HTTP üzerinden çalışabilir. Xamarin Platformu, HTTP üzerinden standart SOAP 1,1 uygulamalarını destekler ve bu, standart ASMX hizmeti yapılandırmalarının birçoğu için destek içerir.

Bu örnek, fiziksel veya öykünülmüş cihazlarda çalışan mobil uygulamaları ve verileri almak, eklemek, düzenlemek ve silmek için yöntemler sağlayan bir ASMX hizmetini içerir. Mobil uygulamalar çalıştırıldığında, aşağıdaki ekran görüntüsünde gösterildiği gibi yerel olarak barındırılan ASMX hizmetine bağlanırlar:

Örnek uygulama

Not

İOS 9 ve üzerinde, uygulama taşıma güvenliği (ATS), internet kaynakları (örneğin, uygulamanın arka uç sunucusu gibi) ile uygulama arasında güvenli bağlantıları uygular ve bu sayede hassas bilgilerin yanlışlıkla açıklanmasını önler. ATS, iOS 9 için oluşturulmuş uygulamalarda 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. ATS, HTTPS Protokolü kullanmak ve internet kaynakları için güvenli iletişim sağlamak mümkün değilse, devre dışı bırakabilirsiniz. Bu, uygulamanın Info. plist dosyası güncelleştirilerek elde edilebilir. Daha fazla bilgi için bkz. uygulama taşıma güvenliği.

Web hizmetini kullanma

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

İşlem Description Parametreler
GetTodoItems Yapılacaklar öğelerinin bir listesini alın
CreateTodoItem Yeni bir yapılacaklar öğesi oluştur XML serileştirilmiş TodoItem
EditTodoItem Yapılacaklar öğesini güncelleştirme XML serileştirilmiş TodoItem
DeleteTodoItem Bir yapılacaklar öğesini silme XML serileştirilmiş TodoItem

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

TodoService proxy oluşturma

Adlı bir proxy sınıfı, TodoServiceSoapHttpClientProtocol ve http üzerinden asmx hizmetiyle iletişim kurmak için yöntemler sağlar. proxy, Visual Studio 2019 veya Visual Studio 2017 ' de platforma özgü her projeye bir web başvurusu eklenerek oluşturulur. Web başvurusu, hizmetin Web Hizmetleri Açıklama Dili (WSDL) belgesinde tanımlanan her bir eylem için yöntemler ve olaylar oluşturur.

Örneğin, GetTodoItems hizmet eylemi, bir GetTodoItemsAsync Yöntem ve GetTodoItemsCompleted proxy 'deki bir olay ile sonuçlanır. Oluşturulan metodun bir void dönüş türü vardır ve GetTodoItems üst sınıfta eylemi çağırır SoapHttpClientProtocol . Çağrılan yöntem hizmetten bir yanıt aldığında, olayı harekete geçirilir GetTodoItemsCompleted ve olay özelliği içinde yanıt verileri sağlar Result .

Isoapservice uygulamasını oluşturma

Paylaşılan, platformlar arası projenin hizmetle birlikte çalışmasını sağlamak için, örnek, ISoapServiceISoapServiceIzleyen arabirimi tanımlar. Her platform, ISoapService platforma özgü proxy 'yi kullanıma sunmak için öğesini uygular. Örnek, TaskCompletionSource proxy 'yi bir görev zaman uyumsuz arabirimi olarak göstermek için nesneleri kullanır. Kullanmayla ilgili ayrıntılar, TaskCompletionSource Aşağıdaki bölümlerde yer alan her bir eylem türünün uygulamalarında bulunur.

Örnek SoapService :

  1. TodoServiceSınıf düzeyi örnek olarak başlatır
  2. ItemsNesneleri depolamak için çağrılan bir koleksiyon TodoItem oluşturur
  3. Üzerinde isteğe bağlı özellik için özel bir uç nokta belirtir UrlTodoService
public class SoapService : ISoapService
{
    ASMXService.TodoService todoService;
    public List<TodoItem> Items { get; private set; } = new List<TodoItem>();

    public SoapService ()
    {
        todoService = new ASMXService.TodoService ();
        todoService.Url = Constants.SoapUrl;
        ...
    }
}

Veri aktarımı nesneleri oluşturma

Örnek uygulama, TodoItem verileri modellemek için sınıfını kullanır. Bir TodoItem öğeyi Web hizmetinde depolamak için öncelikle proxy tarafından oluşturulan türe dönüştürülmesi gerekir TodoItem . Bu, ToASMXServiceTodoItem Aşağıdaki kod örneğinde gösterildiği gibi yöntemi tarafından gerçekleştirilir:

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

Bu yöntem, yeni bir ASMService.TodoItem örnek oluşturur ve her bir özelliği örnekten özdeş özelliğe ayarlar TodoItem .

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

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

Bu yöntem, proxy tarafından oluşturulan türden verileri alır TodoItem ve yeni oluşturulan TodoItem örnekte ayarlar.

Veri alma

ISoapServiceArabirim, RefreshDataAsync yönteminin öğe koleksiyonuyla bir döndürmesini bekliyor Task . Ancak, TodoService.GetTodoItemsAsync yöntemi void döndürür. Arabirim modelini karşılamak için, GetTodoItemsAsync olayın tetiklenmesi için beklemeniz gerekir, GetTodoItemsCompleted sonra da koleksiyonu doldurmanız gerekir. Bu, Kullanıcı arabirimine geçerli bir koleksiyon döndürbırakmanıza olanak tanır.

Aşağıdaki örnek yeni bir oluşturur TaskCompletionSource , yöntemde zaman uyumsuz çağrıyı başlatır RefreshDataAsync ve Task tarafından sağlanmayı bekler TaskCompletionSource . TodoService_GetTodoItemsCompletedOlay işleyicisi çağrıldığında, Items koleksiyonu doldurur ve TaskCompletionSource şunları güncelleştirir:

public class SoapService : ISoapService
{
    TaskCompletionSource<bool> getRequestComplete = null;
    ...

    public SoapService()
    {
        ...
        todoService.GetTodoItemsCompleted += TodoService_GetTodoItemsCompleted;
    }

    public async Task<List<TodoItem>> RefreshDataAsync()
    {
        getRequestComplete = new TaskCompletionSource<bool>();
        todoService.GetTodoItemsAsync();
        await getRequestComplete.Task;
        return Items;
    }

    private void TodoService_GetTodoItemsCompleted(object sender, ASMXService.GetTodoItemsCompletedEventArgs e)
    {
        try
        {
            getRequestComplete = getRequestComplete ?? new TaskCompletionSource<bool>();

            Items = new List<TodoItem>();
            foreach (var item in e.Result)
            {
                Items.Add(FromASMXServiceTodoItem(item));
            }
            getRequestComplete?.TrySetResult(true);
        }
        catch (Exception ex)
        {
            Debug.WriteLine(@"\t\tERROR {0}", ex.Message);
        }
    }

    ...
}

daha fazla bilgi için bkz. zaman uyumsuz programlama modeli ve TPL ve geleneksel .NET Framework zaman uyumsuz programlama.

Veri oluşturma veya düzenleme

Veri oluştururken veya düzenlerken yöntemini uygulamanız gerekir ISoapService.SaveTodoItemAsync . Bu yöntem, TodoItem öğesinin yeni veya güncelleştirilmiş bir öğe olup olmadığını algılar ve nesne üzerinde uygun yöntemi çağırır todoService . CreateTodoItemCompletedVe EditTodoItemCompleted olay işleyicileri Ayrıca, todoService asmx hizmetinden bir yanıt aldığını (aynı işlemi gerçekleştirdiklerinden dolayı tek bir işleyiciye birleştirilebilir) bilmeniz için de uygulanmalıdır. Aşağıdaki örnek, arabirim ve olay işleyicisi uygulamalarının yanı sıra TaskCompletionSource zaman uyumsuz olarak çalışmak için kullanılan nesneyi gösterir:

public class SoapService : ISoapService
{
    TaskCompletionSource<bool> saveRequestComplete = null;
    ...

    public SoapService()
    {
        ...
        todoService.CreateTodoItemCompleted += TodoService_SaveTodoItemCompleted;
        todoService.EditTodoItemCompleted += TodoService_SaveTodoItemCompleted;
    }

    public async Task SaveTodoItemAsync (TodoItem item, bool isNewItem = false)
    {
        try
        {
            var todoItem = ToASMXServiceTodoItem(item);
            saveRequestComplete = new TaskCompletionSource<bool>();
            if (isNewItem)
            {
                todoService.CreateTodoItemAsync(todoItem);
            }
            else
            {
                todoService.EditTodoItemAsync(todoItem);
            }
            await saveRequestComplete.Task;
        }
        catch (SoapException se)
        {
            Debug.WriteLine("\t\t{0}", se.Message);
        }
        catch (Exception ex)
        {
            Debug.WriteLine("\t\tERROR {0}", ex.Message);
        }
    }

    private void TodoService_SaveTodoItemCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
    {
        saveRequestComplete?.TrySetResult(true);
    }

    ...
}

Verileri silme

Verilerin silinmesi benzer bir uygulama gerektirir. Bir TaskCompletionSource olay işleyicisi, uygulama ve ISoapService.DeleteTodoItemAsync yöntemi tanımlayın:

public class SoapService : ISoapService
{
    TaskCompletionSource<bool> deleteRequestComplete = null;
    ...

    public SoapService()
    {
        ...
        todoService.DeleteTodoItemCompleted += TodoService_DeleteTodoItemCompleted;
    }

    public async Task DeleteTodoItemAsync (string id)
    {
        try
        {
            deleteRequestComplete = new TaskCompletionSource<bool>();
            todoService.DeleteTodoItemAsync(id);
            await deleteRequestComplete.Task;
        }
        catch (SoapException se)
        {
            Debug.WriteLine("\t\t{0}", se.Message);
        }
        catch (Exception ex)
        {
            Debug.WriteLine("\t\tERROR {0}", ex.Message);
        }
    }

    private void TodoService_DeleteTodoItemCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
    {
        deleteRequestComplete?.TrySetResult(true);
    }

    ...
}

Web hizmetini test etme

Yerel olarak barındırılan bir hizmetle fiziksel veya benzetilmiş cihazların test edilmesi için özel IIS yapılandırması, uç nokta adresleri ve Güvenlik Duvarı kurallarının yerinde olması gerekir. Ortamınızı test için ayarlama hakkında daha fazla ayrıntı için bkz. Uzaktan erişimi yapılandırma IIS Express. WCF ve ASMX test arasındaki tek fark, TodoService bağlantı noktası numarasıdır.