XML web hizmetinden DataSet kullanma
Bağlantısız DataSet bir tasarımla, kısmen verilerin İnternet üzerinden kolay bir şekilde taşınmasını kolaylaştırmak için tasarlanmıştır. DataSet, XML Web hizmetinden istemciye ve geriye doğru DataSet içeriğini akışa almak için ek kodlama gerekmeden XML Web hizmetlerine giriş veya çıkış olarak belirtilebileceği için "serileştirilebilir". DataSet, DiffGram biçimi kullanılarak örtük olarak bir XML akışına dönüştürülür, ağ üzerinden gönderilir ve ardından XML akışından alıcı uçta DataSet olarak yeniden oluşturulur. Bu, XML Web hizmetlerini kullanarak ilişkisel verileri iletmek ve döndürmek için basit ve esnek bir yöntem sunar. DiffGram biçimi hakkında daha fazla bilgi için bkz . DiffGrams.
Aşağıdaki örnekte ilişkisel verileri (değiştirilen veriler dahil) taşımak ve güncelleştirmeleri özgün veri kaynağına geri çözümlemek için DataSet'i kullanan bir XML Web hizmeti ve istemcisinin nasıl oluşturulacağı gösterilmektedir.
Not
Girişe DataSet
güvenilmemesi durumunda XML Web hizmeti çağrılarının bir parçası olarak iletim veya DataTable
örnekler güvenli değildir. Daha fazla bilgi için bkz . DataSet ve DataTable güvenlik kılavuzu.
Ayrıca, XML Web hizmeti oluştururken her zaman güvenlik etkilerini göz önünde bulundurmanızı öneririz. XML Web hizmetinin güvenliğini sağlama hakkında bilgi için bkz . ASP.NET Kullanılarak Oluşturulan XML Web Hizmetlerinin Güvenliğini Sağlama.
XML web hizmeti oluşturma
XML Web hizmetini oluşturun.
Örnekte, verileri döndüren bir XML Web hizmeti oluşturulur ve bu durumda Northwind veritabanındaki müşterilerin listesi oluşturulur ve XML Web hizmetinin özgün veri kaynağına geri çözümlediği veri güncelleştirmeleri içeren bir DataSet alır.
XML Web hizmeti iki yöntem sunar: GetCustomers, müşteri listesini döndürmek için ve UpdateCustomers, veri kaynağına geri güncelleştirmeleri çözmek için. XML Web hizmeti, Web sunucusundaki DataSetSample.asmx adlı bir dosyada depolanır. Aşağıdaki kod, DataSetSample.asmx dosyasının içeriğini özetler.
<% @ WebService Language = "vb" Class = "Sample" %> Imports System Imports System.Data Imports System.Data.SqlClient Imports System.Web.Services <WebService(Namespace:="http://microsoft.com/webservices/")> _ Public Class Sample Public connection As SqlConnection = New SqlConnection("Data Source=(local);Integrated Security=SSPI;Initial Catalog=Northwind") <WebMethod( Description := "Returns Northwind Customers", EnableSession := False )> _ Public Function GetCustomers() As DataSet Dim adapter As SqlDataAdapter = New SqlDataAdapter( _ "SELECT CustomerID, CompanyName FROM Customers", connection) Dim custDS As DataSet = New DataSet() adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey adapter.Fill(custDS, "Customers") Return custDS End Function <WebMethod( Description := "Updates Northwind Customers", EnableSession := False )> _ Public Function UpdateCustomers(custDS As DataSet) As DataSet Dim adapter As SqlDataAdapter = New SqlDataAdapter() adapter.InsertCommand = New SqlCommand( _ "INSERT INTO Customers (CustomerID, CompanyName) " & _ "Values(@CustomerID, @CompanyName)", connection) adapter.InsertCommand.Parameters.Add( _ "@CustomerID", SqlDbType.NChar, 5, "CustomerID") adapter.InsertCommand.Parameters.Add( _ "@CompanyName", SqlDbType.NChar, 15, "CompanyName") adapter.UpdateCommand = New SqlCommand( _ "UPDATE Customers Set CustomerID = @CustomerID, " & _ "CompanyName = @CompanyName WHERE CustomerID = " & _ @OldCustomerID", connection) adapter.UpdateCommand.Parameters.Add( _ "@CustomerID", SqlDbType.NChar, 5, "CustomerID") adapter.UpdateCommand.Parameters.Add( _ "@CompanyName", SqlDbType.NChar, 15, "CompanyName") Dim parameter As SqlParameter = _ adapter.UpdateCommand.Parameters.Add( _ "@OldCustomerID", SqlDbType.NChar, 5, "CustomerID") parameter.SourceVersion = DataRowVersion.Original adapter.DeleteCommand = New SqlCommand( _ "DELETE FROM Customers WHERE CustomerID = @CustomerID", _ connection) parameter = adapter.DeleteCommand.Parameters.Add( _ "@CustomerID", SqlDbType.NChar, 5, "CustomerID") parameter.SourceVersion = DataRowVersion.Original adapter.Update(custDS, "Customers") Return custDS End Function End Class
<% @ WebService Language = "C#" Class = "Sample" %> using System; using System.Data; using System.Data.SqlClient; using System.Web.Services; [WebService(Namespace="http://microsoft.com/webservices/")] public class Sample { public SqlConnection connection = new SqlConnection("Data Source=(local);Integrated Security=SSPI;Initial Catalog=Northwind"); [WebMethod( Description = "Returns Northwind Customers", EnableSession = false )] public DataSet GetCustomers() { SqlDataAdapter adapter = new SqlDataAdapter( "SELECT CustomerID, CompanyName FROM Customers", connection); DataSet custDS = new DataSet(); adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; adapter.Fill(custDS, "Customers"); return custDS; } [WebMethod( Description = "Updates Northwind Customers", EnableSession = false )] public DataSet UpdateCustomers(DataSet custDS) { SqlDataAdapter adapter = new SqlDataAdapter(); adapter.InsertCommand = new SqlCommand( "INSERT INTO Customers (CustomerID, CompanyName) " + "Values(@CustomerID, @CompanyName)", connection); adapter.InsertCommand.Parameters.Add( "@CustomerID", SqlDbType.NChar, 5, "CustomerID"); adapter.InsertCommand.Parameters.Add( "@CompanyName", SqlDbType.NChar, 15, "CompanyName"); adapter.UpdateCommand = new SqlCommand( "UPDATE Customers Set CustomerID = @CustomerID, " + "CompanyName = @CompanyName WHERE CustomerID = " + "@OldCustomerID", connection); adapter.UpdateCommand.Parameters.Add( "@CustomerID", SqlDbType.NChar, 5, "CustomerID"); adapter.UpdateCommand.Parameters.Add( "@CompanyName", SqlDbType.NChar, 15, "CompanyName"); SqlParameter parameter = adapter.UpdateCommand.Parameters.Add( "@OldCustomerID", SqlDbType.NChar, 5, "CustomerID"); parameter.SourceVersion = DataRowVersion.Original; adapter.DeleteCommand = new SqlCommand( "DELETE FROM Customers WHERE CustomerID = @CustomerID", connection); parameter = adapter.DeleteCommand.Parameters.Add( "@CustomerID", SqlDbType.NChar, 5, "CustomerID"); parameter.SourceVersion = DataRowVersion.Original; adapter.Update(custDS, "Customers"); return custDS; } }
Tipik bir senaryoda, iyimser eşzamanlılık ihlallerini yakalamak için UpdateCustomers yöntemi yazılabilir. Kolaylık olması için örnek bunu içermez. İyimser eşzamanlılık hakkında daha fazla bilgi için bkz . İyimser Eşzamanlılık.
XML Web hizmeti ara sunucusu oluşturun.
XML Web hizmetinin istemcileri, kullanıma sunulan yöntemleri kullanmak için bir SOAP ara sunucusu gerektirir. Visual Studio'ya bu ara sunucuyu sizin için oluşturmasını sağlayabilirsiniz. Visual Studio'dan var olan bir Web hizmetine Web başvurusu ayarlayarak, bu adımda açıklanan tüm davranışlar saydam bir şekilde gerçekleşir. Proxy sınıfını kendiniz oluşturmak istiyorsanız, bu tartışmaya devam edin. Ancak çoğu durumda, istemci uygulaması için ara sunucu sınıfı oluşturmak için Visual Studio kullanmak yeterlidir.
Web Hizmetleri Açıklama Dili Aracı kullanılarak bir ara sunucu oluşturulabilir. Örneğin, XML Web hizmeti URL'sinde
http://myserver/data/DataSetSample.asmx
gösteriliyorsa, WebData.DSSample ad alanına sahip bir Visual Basic .NET proxy'si oluşturmak ve sample.vb dosyasında depolamak için aşağıdaki gibi bir komut gönderin.wsdl /l:VB -out:sample.vb http://myserver/data/DataSetSample.asmx /n:WebData.DSSample
Dosya sample.cs bir C# proxy'si oluşturmak için aşağıdaki komutu çalıştırın.
wsdl -l:CS -out:sample.cs http://myserver/data/DataSetSample.asmx -n:WebData.DSSample
Proxy daha sonra bir kitaplık olarak derlenebilir ve XML Web hizmeti istemcisine içeri aktarılabilir. sample.vb'da depolanan Visual Basic .NET proxy kodunu sample.dll olarak derlemek için aşağıdaki komutu çalıştırın.
vbc -t:library -out:sample.dll sample.vb -r:System.dll -r:System.Web.Services.dll -r:System.Data.dll -r:System.Xml.dll
sample.cs'da depolanan C# proxy kodunu sample.dll olarak derlemek için aşağıdaki komutu çalıştırın.
csc -t:library -out:sample.dll sample.cs -r:System.dll -r:System.Web.Services.dll -r:System.Data.dll -r:System.Xml.dll
XML Web hizmeti istemcisi oluşturun.
Visual Studio'nın sizin için Web hizmeti ara sunucusu sınıfı oluşturmasını istiyorsanız, istemci projesini oluşturmanız yeterlidir ve Çözüm Gezgini penceresinde projeye sağ tıklayıp Hizmet Başvurusu Ekle'yi>seçin. Hizmet Başvurusu Ekle iletişim kutusunda Gelişmiş'i ve ardından Web Başvurusu Ekle'yi seçin. Kullanılabilir Web hizmetleri listesinden Web hizmetini seçin (Bu, Web hizmeti geçerli çözümde veya geçerli bilgisayarda kullanılamıyorsa Web hizmeti uç noktasının adresini sağlamayı gerektirebilir). XML Web hizmeti proxy'sini kendiniz oluşturursanız (önceki adımda açıklandığı gibi), bunu istemci kodunuz içine aktarabilir ve XML Web hizmeti yöntemlerini kullanabilirsiniz.
Aşağıdaki örnek kod proxy kitaplığını içeri aktarır, müşterilerin listesini almak için GetCustomers'ı çağırır, yeni bir müşteri ekler ve ardından UpdateCustomers güncelleştirmelerini içeren bir DataSet döndürür.
Yalnızca değiştirilmiş satırların UpdateCustomers'a geçirilmesi gerektiğinden, örnek DataSet.GetChanges tarafından döndürülen DataSet'i UpdateCustomers'a geçirir. UpdateCustomers, çözümlenen DataSet'i döndürür. Böylece, çözümlenen değişiklikleri ve güncelleştirmedeki satır hatası bilgilerini eklemek için mevcut DataSet'e birleştirebilirsiniz. Aşağıdaki kod, Web başvurusu oluşturmak için Visual Studio kullandığınızı ve Web Başvurusu Ekle iletişim kutusunda Web başvuruyu DsSample olarak yeniden adlandırdığınız varsayılır.
Imports System Imports System.Data Public Class Client Public Shared Sub Main() Dim proxySample As New DsSample.Sample () ' Proxy object. Dim customersDataSet As DataSet = proxySample.GetCustomers() Dim customersTable As DataTable = _ customersDataSet.Tables("Customers") Dim rowAs DataRow = customersTable.NewRow() row("CustomerID") = "ABCDE" row("CompanyName") = "New Company Name" customersTable.Rows.Add(row) Dim updateDataSet As DataSet = _ proxySample.UpdateCustomers(customersDataSet.GetChanges()) customersDataSet.Merge(updateDataSet) customersDataSet.AcceptChanges() End Sub End Class
using System; using System.Data; public class Client { public static void Main() { Sample proxySample = new DsSample.Sample(); // Proxy object. DataSet customersDataSet = proxySample.GetCustomers(); DataTable customersTable = customersDataSet.Tables["Customers"]; DataRow row = customersTable.NewRow(); row["CustomerID"] = "ABCDE"; row["CompanyName"] = "New Company Name"; customersTable.Rows.Add(row); DataSet updateDataSet = new DataSet(); updateDataSet = proxySample.UpdateCustomers(customersDataSet.GetChanges()); customersDataSet.Merge(updateDataSet); customersDataSet.AcceptChanges(); } }
Proxy sınıfını kendiniz oluşturmaya karar verirseniz, aşağıdaki ek adımları uygulamanız gerekir. Örneği derlemek için, oluşturulan proxy kitaplığını (sample.dll) ve ilgili .NET kitaplıklarını sağlayın. Client.vb dosyasında depolanan örneğin Visual Basic .NET sürümünü derlemek için aşağıdaki komutu çalıştırın.
vbc client.vb -r:sample.dll -r:System.dll -r:System.Data.dll -r:System.Xml.dll -r:System.Web.Services.dll
Client.cs dosyasında depolanan örneğin C# sürümünü derlemek için aşağıdaki komutu çalıştırın.
csc client.cs -r:sample.dll -r:System.dll -r:System.Data.dll -r:System.Xml.dll -r:System.Web.Services.dll