Introduction
Xamarin Form could be the most attractive tool on mobile App development. But right now, consuming WCF from Xamarin Form PCL can be still a kind of challenge. To get this feature, our development team spent a lot of effort. The final success approach is rather tricky. To share with the community, we would like to post a detailed step by step description here.
Background
The development environment is Windows 10 Home and Visual Studio 2015 Community. We tried a lot to create a WCF proxy in PCL based on online documentation and posts. But none of them works as is. Later, we tried a little bit other way, and it works.
Step By Step Description
1. Create a solution of Xamarin Form application with highest .NET version:
2. Create an additional project of WCF application:
3. The Solution Explorer looks like this:
Remarks: Build project WcfService1. Otherwise it cannot be referenced.
4. Try to add the WebService1 into PCL as service reference:
You see, there is no menu item Service Reference… beneath the menu item Reference…. This is the key point of this post - get the menu item Service Reference… appearing.
All we need to do is setup Profile 78 on PCL. Following approach makes the tricky:
5. Temporally disable the NuGet package by means of changing the package name like following example: Change packages.config to packages.config.BAK:
Without this approach, the project settings change to Profile 78 might not be allowed.
6. Now right click the PCL project to open Properties:
7. Click button Change… to open the dialogbox Change Targets:
Change to settings showing above then click button OK. Change packages.config.BAK back to packages.config.
8. Now repeat to try to add the WCF proxy, the menu item “Service Reference…” should appear:
Click the menu item Service Reference…, dialogbox Add Service Reference will appear. See the next item:
9. Clicking button Discover, it find the Service1 just created:
Click button OK.
10. The WCF proxy is created as ServiceReference1:
11. To test the proxy, create a method callWCF()
in root file App.cs and revoke from inside the contractor in an asynchronously manner:
public App()
{
…
callWCF();
}
private void callWCF()
{
var wcf = new ServiceReference2.Service1Client();
wcf.GetDataCompleted += Wcf_GetDataCompleted;
wcf.GetDataAsync(123456);
}
private void Wcf_GetDataCompleted(object sender, ServiceReference2.GetDataCompletedEventArgs e)
{
string str = e.Result;
throw new NotImplementedException();
}
By this case, the retrieved value from WCF should be “You entered: 123456” at point e.Result.
12. Note: The WebService method GetData()
is as attached as following:
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
Points of Interest
The trick here to realize Profile 78 could be an exited approach to resolve WCF sonsuming issue.