在Xamarin Cross Platform Application中使用WCF服务

我创建了一个WCF服务,它从SQL数据库中检索数据,并可以将数据更新和修改为SQL数据库。 我试图从xamarin for android和xamarin for iOS调用WCF方法。 我搜索了一个例子,如何从WCF服务调用PUT和POST方法,通过xamarin for android和xamarin for iOS但没有运气。 我在下面添加了WCF代码以供参考。 …甚至创建了Web API,但所有使用Web API的示例和教程都是关于如何调用GET方法的。 我没有看到任何参考文档,它将展示如何通过跨平台从WCF或Web api调用PUT或Post方法。 我通过Fiddler测试了WCF服务并且工作正常。 下一步将是什么..我已经使用xamarin文档中提到的SlsvcUtil.exe为此Web服务创建了代理。 有人发布了一个xamarin.Android的例子,它将从下面的wcf服务中调用Update或delete方法。正在寻找help.Service包含webHttp绑定。

WCF

Service1.svc.cs

using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; public class Service1 : IService1 { public List GetDeptsList() { using (DeptDBEntities entities = new DeptDBEntities()) { return entities.Depts.ToList(); } } public Dept GetDeptByID(string no) { try { int deptId = Convert.ToInt32(no); using (DeptDBEntities entities = new DeptDBEntities()) { return entities.Depts.SingleOrDefault(dept => dept.no == deptId); } } catch { throw new FaultException("Something went wrong"); } } public void AddDept(string name) { using (DeptDBEntities entities = new DeptDBEntities()) { Dept dept = new Dept { name = name }; entities.Depts.Add(dept); entities.SaveChanges(); } } public void UpdateDept(string no, string name) { try { int deptId = Convert.ToInt32(no); using (DeptDBEntities entities = new DeptDBEntities()) { Dept dept = entities.Depts.SingleOrDefault(b => b.no == deptId); dept.name = name; entities.SaveChanges(); } } catch(Exception e) { throw new FaultException(e.Message); } } public void DeleteDept(string no) { try { int deptId = Convert.ToInt32(no); using (DeptAppDBEntities entities = new DeptAppDBEntities()) { Dept dept = entities.Depts.SingleOrDefault(b => b.no == deptId); entities.Depts.Remove(dept); entities.SaveChanges(); } } catch { throw new FaultException("Something went wrong"); } } } 

web.config中

     
</configuration

>

Main.axml for

       

这是一个简单的代码片段,可用作指南:

 //first at the class level, create a private variable for the client. private Service1Client _client; private Button _addButon; private TextView _txtDeptName; //Initialize the _client in the OnCreate() method. protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); var endpoint = new EndpointAddress("http:///Service1.svc"); var binding = new BasicHttpBinding{ Name = "basicHttpBinding", MaxBufferSize = 2147483647, MaxReceivedMessageSize = 2147483647 }; TimeSpan timeout = new TimeSpan(0, 0, 30); binding.SendTimeout = timeout; binding.OpenTimeout = timeout; binding.ReceiveTimeout = timeout; _client = new Service1Client(binding, endpoint); _client.AddDeptCompleted += ClientAddDeptCompleted; _addButton = FindViewById 

您应该能够按照其他按钮和服务调用的类似模式。 如果我犯了一些错字,我道歉。 我将从Xamarin网站上的一些内存和一些WCF指令开始。

首先,您必须将服务添加到项目中您可以使用以下命令执行此操作:

Cd C:\ Program Files(x86)\ Microsoft SDKs \ Silverlight \ v5.0 \ Tools \ SlSvcUtil.exe http:// localhost:2323 / HisDashboardService / ProfilerService.svc / directory:“C:\ Folder”

然后添加到创建的项目文件要使用添加的服务,必须遵循以下过程

 public class ServiceAccessor { static string serviceUrl = "http://172.16.12.17:7698/HisDashboardService/"; public static readonly EndpointAddress ProfilerServiceEndPoint = new EndpointAddress(serviceUrl + "ProfilerService.svc"); private ProfilerServiceClient _profilerServiceClient; private static ServiceAccessor _instanceServiceAccessor; public static ServiceAccessor Instance { get { return _instanceServiceAccessor ?? (_instanceServiceAccessor = new ServiceAccessor()); } } ServiceAccessor() { InitializeServiceClient(); } private void InitializeServiceClient() { BasicHttpBinding binding = CreateBasicHttp(); #region ProfilerService _profilerServiceClient = new ProfilerServiceClient(binding, ProfilerServiceEndPoint); #endregion ProfilerService } private static BasicHttpBinding CreateBasicHttp() { BasicHttpBinding binding = new BasicHttpBinding { Name = "basicHttpBinding", MaxBufferSize = 2147483647, MaxReceivedMessageSize = 2147483647 }; TimeSpan timeout = new TimeSpan(1, 0, 0); binding.SendTimeout = timeout; binding.OpenTimeout = timeout; binding.ReceiveTimeout = timeout; return binding; } }