Easy-to-follow video tutorials help you learn software, creative, and business skills.Become a member
There is often a requirement when building an application to communicate with an external service. In today's programming environment, that service often lives in the cloud. Programmers have been working for years to come up with the best way of communicating with a remote service. Microsoft has several ideas here too. For example, they have web services, remoting, and a multitude of networking protocols. A few years back, Microsoft decided to create a unified architecture for working with these disparate technologies.
The outcome of that work is called Windows Communication Foundation, also known as WCF. The key point about WCF is that it works in a flexible way. You create a service that provides data or functions. Through a configuration file, you specify which technologies this service will use for the communication channel, and how the data will be transmitted. By changing the configuration files on the client and the server, you can easily change to another channel. I am inside Visual Studio.
It's important that you run Visual Studio as an administrator if you want to test the project. I have opened a solution called ProvideWcfServices. This solution already contains a service project called BookServicesV2. This is the finished version of this service. I am going to show you how to use the WCF project template to create a project. I am going to right-click on my solution and choose Add > New Project. I am going to choose my language of choice-- today it's going to be Visual C#--and then I am going to click on the WCF folder.
Do you see that I have four templates in here? The one I am going to work with today is the WCF Service Library. I am going to call this one BookServicesV1, and then I am going to click OK. This should go in the same folder as the existing solution. I see I have a typo. I said BookServices, but I typed BookService.
Let me fix that and then click OK. Here is my service. Now remember what I am doing here. I am writing some code that's going to do some work for my clients, or going to provide some data for them. WCF expects you to write an interface, and they have already stubbed in one interface for you called IService. Then you're supposed to create a concrete implementation of that service by creating a class. So there is also a class here called BookServices. There is also a class here called Service1.
These are not good names for my services. I am thinking I am going to be working with a library of books, so I might want to have it called BookService and IBook and names along those lines. So what I can do is refactor these by clicking on the IService name here, changing it in the file to IBook. Visual Studio notices that I am changing the file and is suggesting that I also rename the references in code. I am going to say Yes.
Can you see what happened here on line 11? Now it says IBook there. Then I need to rename this service, the concrete class. I am going to call this one Book, and it will go through the same process: "Would you like to rename this?" I am going to say yes. Next, I need to go into my interface and provide the operational contracts. I am going to specify what is okay to expose to the network by adding these attributes in my code. For instance, you can see I have got this class down here that is a DataContract, and I've got an interface up here that is a ServiceContract, and I've got a method here that has an OperationContract on it. That's saying that this operation or this function is exposable from the web service.
In order to make the application work, I need to set a configuration. Both the service that's running on a server somewhere and the client need to have a configuration file saying how they plan to communicate. To make it easy to create a configuration file, you can right-click on this App.config and choose Edit WCF Configuration. Now the details of how to set this up are beyond the scope of this introduction to web services. Just let me point out this one piece.
Here is this service that I am exposing, BookServicesV1.Book, and underneath this, I can see the Host. I am not sure if this is going to work correctly on your machine. On my machine, I have localhost set up, and I have this hardcoded port, 8732. I believe if you open this application on your machine, it should use the same port. If not, you'll need to investigate which port is running on your server and change this number to match your machine. Rather than setting up this configuration, I already have a second version of this application that's set up correctly.
So I am going to close this dialog, and I am going to show you BookServicesV2. Inside BookServicesV2, I have a class called BookData, which has a BookId, Title, Author, and Price. Inside my BookService, which you remember is my Concrete class, I have a private field that contains a list of BookData. I have a constructor that fills that list full of instances of BookData and then down in this section, I have added some methods: AddBook, UpdatePrices, and GetBooks.
You might remember that I said, in my IBook services, I need to set up my contract. So if I look over here, you'll see that I have a contract that says I have an Operational contract for the AddBook method, the Update books, and the GetBooks. So I've got those all set up correctly. Next, I go to my configuration file, set that up, and then lastly, I am ready to test this out. So I am going to start the application.
Notice down here in the lower right-hand corner, it says that my service has been hosted-- that means it's running on the server--and click here to view detailed information. That's the one I wanted to see. I actually have two services running right now. I have the new service I just added and the existing service, and it took them a little while for the second service to show up. This is the one I was showing you earlier today, and here is the one, the finished version. I am going to close these dialogs down, and I am going to unload this BookService, so it's not too confusing.
I am going to right-click on it and choose Unload Project. Now, when I run the application, it won't compile or run that service. It shows my service has started. This is the end point. If I have a client out there somewhere that wants to call this service, this is the address that you are going to go to. And because I don't have a client, Visual Studio creates this testing harness called the WCF Test Client.
This shows that my service exposes three items through the operational contract: AddBook, UpdatePrices, and GetBooks. So I can double-click on this GetBooks functions, and then come over here and click on Invoke. So I am now taking the role of a client who is going to call that service. I am getting warned that I am doing something where the information is going to go over the Internet, and people could see what's in that call to the server. I am going to go ahead and say OK to this message. It's contacting the server and then down here in the bottom, it shows it returned a list of three items.
There is a book with an Author called Walt Ritscher, and another book down here with Sam Pearson, and down here is one for Sarah. All right, I can choose this UpdatePrices, enter the new increased amount, 1.2 and click on Invoke. That method is going to go to the server and change the prices on the book. So now if I call GetBooks again, and invoke it, I should see some new prices.
I would like to remind you that you have to run Visual Studio as an administrator if you want to invoke this test client, like I am doing here, or if you want to try out the service. It's review time. What have I done in this movie? I created a service, and I configured it to run on my local server. I exposed a method on the service through a data contract. In the next movie, I am going to show you how to use this service from a client-side application.
Get unlimited access to all courses for just $25/month.Become a member