简体   繁体   English

在 Xamarin 跨平台应用程序中使用 WCF 服务

[英]Consume WCF service in Xamarin Cross Platform Application

I have created a WCF service that retrieves data from SQL database and can update and modify data into SQL database.我创建了一个 WCF 服务,它从 SQL 数据库中检索数据,并且可以将数据更新和修改到 SQL 数据库中。 I am trying to call WCF methods from xamarin for android and xamarin for iOS.我正在尝试从 xamarin for android 和 xamarin for iOS 调用 WCF 方法。 I searched alot for an example how to call PUT and POST method from WCF service through xamarin for android and xamarin for iOS but no luck.我搜索了很多示例如何通过 xamarin for android 和 xamarin for iOS 从 WCF 服务调用 PUT 和 POST 方法,但没有运气。 I have added the WCF code below for reference.我在下面添加了 WCF 代码以供参考。 ...even created Web API but all examples and tutorials to consume Web API are for how to call GET method . ...甚至创建了 Web API,但所有使用 Web API 的示例和教程都是关于如何调用 GET 方法的。 I don't see any reference document which will show how to call PUT or Post method from WCF or Web api across cross platform.我没有看到任何参考文档将展示如何跨平台从 WCF 或 Web api 调用 PUT 或 Post 方法。 I have tested WCF service through Fiddler and worked fine.我已经通过 Fiddler 测试了 WCF 服务并且工作正常。 What would be the next step ..I have created proxy for this web service using SlsvcUtil.exe as mentioned in xamarin documentation.下一步是什么..我已经使用 Xamarin 文档中提到的 SlsvcUtil.exe 为这个 Web 服务创建了代理。 Can somebody post a one example of xamarin.Android that will call Update or delete method from the below wcf service.Desperately looking for help.Service contains webHttp binding.有人可以发布一个 xamarin.Android 示例,它将从下面的 wcf 服务调用更新或删除方法。绝望地寻找帮助。服务包含 webHttp 绑定。

WCF WCF

Service1.svc.cs服务1.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网页配置

   <?xml version="1.0"?>
      <configuration>
      <configSections>
       <section name="entityFramework"   type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
     </configSections>
     <system.web>
     <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
      </assemblies>
      </compilation>
      <pages controlRenderingCompatibilityVersion="4.0"/>
      </system.web>
      <system.serviceModel>
                 <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
      </behaviors>
      <services>
      <service name="WcfWithJsonP.Service1" behaviorConfiguration="restfulBehavior">
        <endpoint address="" behaviorConfiguration="webBehavior" binding="webHttpBinding" bindingConfiguration="" contract="WcfWithJsonP.IService1"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost/Service1"/>
          </baseAddresses>
        </host>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        </service>
       </services>
      <behaviors>
      <endpointBehaviors>
        <behavior name="webBehavior">
          <webHttp defaultOutgoingResponseFormat="Json"/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="restfulBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
      </behaviors>
      <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
      </system.serviceModel>
     <system.webServer>
     <modules runAllManagedModulesForAllRequests="true"/>
        <directoryBrowse enabled="true"/>
     </system.webServer>
     <entityFramework>
     <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory,   EntityFramework">
      <parameters>
        <parameter value="v12.0"/>
      </parameters>
     </defaultConnectionFactory>
     </entityFramework>
    </configuration

> >

Main.axml for Main.axml 为

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:minWidth="25px"
    android:minHeight="25px">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="134.1dp"
        android:layout_height="fill_parent"
        android:minWidth="25px"
        android:minHeight="25px">
        <TextView
            android:text="Enter No:"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:layout_width="163.4dp"
            android:layout_height="wrap_content"
            android:id="@+id/No"
            android:layout_marginBottom="27.5dp"
            android:layout_marginTop="0.0dp"
            android:layout_marginLeft="5dp" />
        <TextView
            android:text="Enter name:"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:layout_width="252.7dp"
            android:layout_height="wrap_content"
            android:id="@+id/Name"
            android:layout_marginBottom="27.5dp"
            android:layout_marginTop="0.0dp"
            android:layout_marginLeft="5dp"
            android:enabled="false"
            android:visibility="invisible" />
    </LinearLayout>
    <Button
        android:id="@+id/Get"
        android:layout_width="fill_parent"
        android:layout_height="36.6dp"
        android:text="Get" />
    <Button
        android:id="@+id/ADD"
        android:layout_width="fill_parent"
        android:layout_height="36.6dp"
        android:text="ADD" />
    <Button
        android:id="@+id/Update"
        android:layout_width="fill_parent"
        android:layout_height="36.6dp"
        android:text="Update" />
    <Button
        android:id="@+id/Delete"
        android:layout_width="fill_parent"
        android:layout_height="36.6dp"
        android:text="Delete" />
    <TextView
        android:text=""
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/ValueNo"
        android:layout_marginBottom="27.5dp"
        android:layout_marginTop="0.0dp"
        android:background="@android:color/holo_purple" />
    <TextView
        android:text=""
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/ValueName"
        android:layout_marginBottom="27.5dp"
        android:layout_marginTop="0.0dp"
        android:background="@android:color/holo_purple" />
</LinearLayout>

Here is a simple code snippet to use as a guide:这是一个简单的代码片段,可用作指南:

//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://<ipAddress:port>/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<Button>(Android.Resources.Id.Add);
    _addbutton.Click += AddButton_Clicked;

    _txtDeptName = FindViewbyId<TextView>(Android.Resources.Id.Name);
}

//Then within the event handlers, do something like this
public void AddButton_Clicked(object sender, EventArgs e)
{
     _client.AddDeptAsync(_txtDeptName.Text);
}

//Handle the request completed event.
private void ClientAddDeptCompleted(object sender, AddDeptCompletedEventArgs addDeptCompletedEventArgs)
{
     //TODO: Something with the notification that the request has completed.
}

You should be able to follow a similar pattern for the other buttons and service calls as well.对于其他按钮和服务调用,您也应该能够遵循类似的模式。 I apologize if I have made some typos.如果我犯了一些错别字,我深表歉意。 I'm going from a bit of memory and some of the WCF instructions on the Xamarin site.我将从 Xamarin 站点上的一些内存和一些 WCF 说明开始。

First you must add the service to your project You can do this using the following command:首先,您必须将服务添加到您的项目中,您可以使用以下命令执行此操作:

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

Then add to a project file created To use the added service must follow the following procedure然后添加到创建的项目文件中使用添加的服务必须遵循以下步骤

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;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM