niedziela, 28 lutego 2010

Tworzenie webserwisu WCF cz. 1


Dzisiaj coś łatwego – stworzenie prostego web serwisu WCF i jego konsumpcja za pomocą aplikacji ASP.NET. 
Całość została podzielona na 3 części: 
1. (ta którą obecnie drogi czytelniku oglądasz) obejmuje tematyką tworzenie aplikacji WCF
2. Opisuje testowanie aplikacji WCF
3. Pokazuje w jaki sposób za pomocą ASP.NET "skonsumować" aplikację WCF
Nasz web serwis będzie umożliwiał wyświetlenie wszystkich naszych klientów, wybranego klienta oraz pozwoli dodawać nowych klientów.
Dla przykładu posłużę się bazą danych AdventureWorksLT2008 działającą pod kontrolą SQL Server 2008. Kroki, które należy wykonać aby utworzyć WebService:
1. Uruchamiamy Visual Studio 2008 i tworzymy nowy projekt: WCF Service Library
Warto tutaj zauważyć, że w szablonach VS mamy do wyboru WCF Service Application. Nie zalecam jego używania, gdyż ma ograniczone możliwości. W przypadku biblioteki otrzymujemy komponent który możemy następnie jako web serwis, usługę systemu Windows itp. Z kolei WCF Service Application oferuje nam podobne możliwości co web serwisy na platformie ASP.NET.
2. Usuwamy pliki Iservice1.cs i Service1.svc (stworzymy całość od 0)
3. Dodajemy nową klasę do naszego projektu:


    [DataContract]
    public class Customer
    {
        private int _id;
        [DataMember]
        public int ID
        {
            get
            {
                return _id;
            }
            set
            {
                _id = value;
            }
        }
 
        private string _firstName;
        [DataMember]
        public string FirstName
        {
            get
            {
                return _firstName;
            }
            set
            {
                _firstName = value;
            }
        }
        [DataMember]
        private string _lastName;
        public string LastName
        {
            set
            {
                _lastName = value;
            }
            get
            {
                return _lastName;
            }
 
        }
    }
}
Atrybut DataContract pozwala na utworzenie kontraktu dzięki któremu nastąpi serializacja do XMLa. Poprzez atrybuty DataMember określamy które pola mają zostać zserializowane.
4. Dodajemy do naszego projektu interfejs:




    [ServiceContract]
    public interface ICustomerService
    {
        [OperationContract]
        void AddNewCustomer(Customer customer);
        [OperationContract]
        Customer GetCustomerById(int id);
        [OperationContract]
        DataTable GetAllCustomers();
    }


ICustomerService definiuje jakie operacje będą widoczne na zewnątrz (czyli z jakich metod będzie mógł korzystać użytkownik naszej aplikacji). Znacznikiem [ServiceContract] oznaczamy klasę/strukturę lub interfejs który zamierzamy udostępnić a znacznikami OperationContract oznaczamy które metody będą eksponowane.
5. Przechodzimy do części odpowiedzialnej za obsługę connectionStringów i dodajemy odpowiedni dla naszej bazy danych:

<add name="AdventureWorks" providerName="System.Data.SqlClient"  
connectionString="Data Source=.\sqlexpress;Initial Catalog=
AdventureWorksLT2008;Integrated Security=True"/>

6. Dodajemy kolejną klasę, która będzie implementowała nasz interfejs:







    [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
    class CustomerService : ICustomerService
    {
        private string providerName = ConfigurationManager.
ConnectionStrings["AdventureWorks"].ProviderName;
        private string connectionString = ConfigurationManager.
ConnectionStrings["AdventureWorks"].ConnectionString;
        #region ICustomerService Members
 
        public void AddNewCustomer(Customer customer)
        {
            DbProviderFactory dbFactory = DbProviderFactories.GetFactory
(providerName);
            DbConnection conn = dbFactory.CreateConnection();
            conn.ConnectionString = connectionString;
            DbCommand cmd = conn.CreateCommand();
            try
            {
                cmd.CommandText = "INSERT INTO SalesLT.Customer(FirstName, 
LastName) VALUES(@firstName, @lastName)";
                conn.Open();
                DbParameter parameter = dbFactory.CreateParameter();
                parameter.DbType = DbType.AnsiString;
                parameter.Value = customer.FirstName;
                parameter.ParameterName = "firstName";
                cmd.Parameters.Add(parameter);
                parameter = dbFactory.CreateParameter();
                parameter.DbType = DbType.AnsiString;
                parameter.Value = customer.LastName;
                parameter.ParameterName = "lastName";
                cmd.Parameters.Add(parameter);
                cmd.ExecuteNonQuery();
                conn.Close();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
 
        public Customer GetCustomerById(int id)
        {
            DbProviderFactory dbFactory = DbProviderFactories.GetFactory
(providerName);
            DbConnection conn = dbFactory.CreateConnection();
            conn.ConnectionString = connectionString;
            conn.ConnectionString = connectionString;
            DbCommand cmd = conn.CreateCommand();
            try
            {
                cmd.CommandText = "select FirstName, LastName from SalesLT.
Customer where CustomerID = @custId";
                DbParameter parameter = dbFactory.CreateParameter();
                parameter.DbType = DbType.Int32;
                parameter.Value = id;
                parameter.ParameterName = "custId";
                cmd.Parameters.Add(parameter);
 
                DbDataAdapter da = dbFactory.CreateDataAdapter();
                da.SelectCommand = cmd;
                DataSet ds = new DataSet();
                da.Fill(ds);
                Customer c = new Customer();
                c.ID = id;
                c.FirstName = ds.Tables[0].Rows[0]["FirstName"].ToString();
                c.LastName = ds.Tables[0].Rows[0]["LastName"].ToString();
                return c;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
 
        public System.Data.DataTable GetAllCustomers()
        {
            DbProviderFactory dbFactory = DbProviderFactories.GetFactory
(providerName);
            DbConnection conn = dbFactory.CreateConnection();
            conn.ConnectionString = connectionString;
            DbCommand cmd = conn.CreateCommand();
            try
            {
                cmd.CommandText = "select FirstName, LastName from SalesLT.
Customer";
                conn.Open();
                DbDataAdapter da = dbFactory.CreateDataAdapter();
                da.SelectCommand = cmd;
                DataSet ds = new DataSet();
                da.Fill(ds);
                conn.Close();
                return ds.Tables[0];
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
 
        #endregion
    }
Metody działają tak jak są opisane. AddNewCustomer dodaje nowego klienta, 
GetCustomerById powoduje zwrócenie imienia i nazwiska klienta o określonym Id. 
GetCustomers zwraca wszystkich klientów. 

7. Przechodzimy do modyfikacji ustawień naszego serwisu klikamy prawym klawiszem 
myszy na plik App.config i wybieramy Edit WCF Configuration. Po wybraniu tej 
opcji powinniśmy ujrzeć następujący ekran:
 
 
Pierwsze co rzuca się w oczy to niewłaściwa nazwa naszego serwisu. Aby zmienić ją na 
poprawną (AdventureWorks) wchodzimy w kolejno Services -> AdventureWorks.Service1 -> 
właściwość name. Po kliknięciu na klawisz wyboru  przechodzimy kolejno do: bin -> 
Debug -> AdventureWorks.dll -> AdventureWorks.CustomerService po kliknięciu na 
open nazwa serwisu się zmieni na prawidłową.
 
Następnie modyfikujemy punkty końcowe naszego serwisu:
 
Przechodzimy tak jak poprzednio przez wszystkie foldery i wybieramy: 
AdentureWorks.ICustomerService

Drugi punkt końcowy służy do pobierania metadanych podczas działania naszego 
serwisu. Tak więc zostawiamy wartości drugiego punktu końcowego nietknięte.  

Brak komentarzy:

Prześlij komentarz