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:
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ı TodoService
bir 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
:
- Sınıf düzeyinde örnek olarak örneği
TodoService
oluşturur - Nesneleri depolamak
TodoItem
için adlıItems
bir koleksiyon oluşturur - üzerindeki isteğe bağlı
Url
özellik için özel bir uç nokta belirtirTodoService
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 TaskCompletionSource
bir oluşturur, yönteminde zaman uyumsuz çağrıyı RefreshDataAsync
başlatır ve tarafından sağlanan öğesini Task
TaskCompletionSource
bekler. 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 TaskCompletionSource
tanı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.