ASP.NET Web Hizmeti (ASMX) kullanma

ASMX, Basit Nesne Erişim Protokolü(SOAP) kullanarak ileti gönderen web hizmetleri oluşturma olanağı sağlar. SOAP, web hizmetlerini 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 hakkında hiçbir şey bilmesi gerekmez. Yalnızca SOAP iletileri gönderip almayı anlamaları yeterlidir. Bu makalede, bir uygulamadan ASMX SOAP hizmetinin nasıl tükettiği gösterilmektedir Xamarin.Forms .

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

  • XML belgesini SOAP iletisi olarak tanımlayan Envelope adlı kök öğe.
  • Kimlik doğrulama verileri gibi uygulamaya özgü bilgileri içeren isteğe bağlı bir Üst Bilgi öğesi. Header öğesi varsa, 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 Fault öğesi. Fault öğesi varsa, Body öğesinin alt öğesi olmalıdır.

SOAP, HTTP, SMTP, TCP ve UDP gibi birçok aktarım protokolü üzerinde çalışabilir. Ancak ASMX hizmeti yalnızca HTTP üzerinden çalışabilir. Xamarin platformu, HTTP üzerinden standart SOAP 1.1 uygulamalarını destekler ve bu, standart ASMX hizmet 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 alma, ekleme, düzenleme ve silme yöntemleri 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ır:

Ö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

ASMX 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.

TodoService ara sunucusunu oluşturma

adlı TodoServicebir proxy sınıfı, ASMX hizmetiyle HTTP üzerinden iletişim kurmak için yöntemleri genişletir SoapHttpClientProtocol ve sağlar. Ara sunucu, Visual Studio 2019 veya Visual Studio 2017'de platforma özgü her projeye web başvurusu eklenerek oluşturulur. Web başvurusu, hizmetin Web Hizmetleri Açıklama Dili (WSDL) belgesinde tanımlanan her eylem için yöntemler ve olaylar oluşturur.

Örneğin, GetTodoItems hizmet eylemi bir GetTodoItemsAsync yönteme ve ara sunucudaki bir GetTodoItemsCompleted olaya neden olur. Oluşturulan yöntem geçersiz bir dönüş türüne sahiptir ve eylemi üst SoapHttpClientProtocol sınıfta çağırırGetTodoItems. Çağrılan yöntem hizmetten bir yanıt aldığında, olayı başlatır GetTodoItemsCompleted ve olayın özelliği içinde Result yanıt verilerini sağlar.

ISoapService uygulamasını oluşturma

Paylaşılan, platformlar arası projenin hizmetle çalışmasını sağlamak için örnek, C# dilinde Görev zaman uyumsuz programlama modelini izleyen arabirimi tanımlarISoapService. Her platform, platforma özgü ara sunucuyu kullanıma açmak için öğesini ISoapService uygular. Örnek, ara sunucuyu zaman uyumsuz bir görev arabirimi olarak kullanıma açmak için nesneleri kullanır TaskCompletionSource . Kullanımıyla TaskCompletionSource ilgili ayrıntılar, aşağıdaki bölümlerde yer alan her eylem türünün uygulamalarında bulunur.

Örneği SoapService:

  1. Sınıf düzeyinde örnek olarak örneği TodoService oluşturur
  2. Nesneleri depolamak TodoItem için adlı Items bir koleksiyon oluşturur
  3. üzerindeki isteğe bağlı Url özellik için özel bir uç nokta belirtir TodoService
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, 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 ToASMXServiceTodoItem 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 ASMService.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 FromASMXServiceTodoItem 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, ara sunucu tarafından oluşturulan TodoItem türden verileri alır ve yeni oluşturulan TodoItem örnekte ayarlar.

Veri alma

ISoapService arabirimi, yönteminin RefreshDataAsync öğe koleksiyonuyla bir Task döndürmesini bekler. Ancak, TodoService.GetTodoItemsAsync yöntemi void döndürür. Arabirim desenini karşılamak için öğesini çağırmanız GetTodoItemsAsync, olayın tetiklenmesini GetTodoItemsCompleted beklemeniz ve koleksiyonu doldurmanız gerekir. Bu, kullanıcı arabirimine geçerli bir koleksiyon döndürmenizi sağlar.

Aşağıdaki örnek yeni TaskCompletionSourcebir oluşturur, yönteminde zaman uyumsuz çağrıyı RefreshDataAsync başlatır ve tarafından sağlanan öğesini TaskTaskCompletionSourcebekler. TodoService_GetTodoItemsCompleted Olay işleyicisi çağrıldığında, koleksiyonu doldurur Items ve güncelleştirirTaskCompletionSource:

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 ISoapService.SaveTodoItemAsync gerekir. Bu yöntem, öğesinin TodoItem yeni mi yoksa güncelleştirilmiş bir öğe mi olduğunu algılar ve nesne üzerinde todoService uygun yöntemi çağırır. CreateTodoItemCompleted ve EditTodoItemCompleted olay işleyicileri de uygulanarak ASMX hizmetinden todoService ne zaman yanıt alındığını bilmeniz gerekir (aynı işlemi gerçekleştirdikleri için bunlar tek bir işleyicide birleştirilebilir). Aşağıdaki örnek, arabirim ve olay işleyicisi uygulamalarının yanı TaskCompletionSource sıra 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);
    }

    ...
}

Veri silme

Verileri silmek için benzer bir uygulama gerekir. bir TaskCompletionSourcetanımlayın, bir olay işleyicisi uygulayın ve ISoapService.DeleteTodoItemAsync yöntemi:

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

Fiziksel veya öykünülmüş cihazların yerel olarak barındırılan bir hizmetle 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 . IIS Express'e uzaktan erişimi yapılandırma. WCF ve ASMX testi arasındaki tek fark, TodoService bağlantı noktası numarasıdır.