Xamarin.Forms使用webService介绍,ASP.NET(asmx)

    在Xamarin里面,IOS、Android、uwp,web服务实现方式都是不一样的,因此同一个web服务 在要3个平台要分别添加3次web服务,关于vs中如何添加web服务,这个就不多说了。

    在共享项目中(或者PCL)建立接口。只定义方法,不定义具体。

    public interface ISoapService
    {
        Task <byte[]> DownloadClassById(int id);
        Task <byte[]> DownloadClassByName(string name);
        Task <int> GetDocumentLenById(int id);
        Task <int> GetDocumentLenByName(string name);
        Task <int> UploadClass(string name, byte[] bytes);
    }

    然后在分项目中,继承接口,实现具体方法。(在安卓中实现如下)


    class SyncService : ISoapService
    {
        com.songshizhao.kechengbiao client = new com.songshizhao.kechengbiao();
        async public Task<byte[]> DownloadClassById(int id)
        {
            return client.DownloadClassById(id);
        }

        async public Task<byte[]> DownloadClassByName(string name)
        {
            return client.DownloadClassByName(name);
        }

        async public Task<int> GetDocumentLenById(int id)
        {
            return client.GetDocumentLenById(id);
        }

        async public Task<int> GetDocumentLenByName(string name)
        {
            return client.GetDocumentLenByName(name);
        }

        async public Task<int> UploadClass(string name, byte[] bytes)
        {
            return client.uploadclass(name,bytes);
        }
    }
    其中com.songshizhao.kechengbiao是我们引用的WebService,com.songshizhao是自定义的命名空间,这样就在Android平台中实现了引用的web服务,但现在还没“注入”。


    在共享项目/PCL的主程序App.cs(名称不一定,但一定继承App)类中添加全局静态变量

public static ISoapService MySoapServiceManager { get; set; }
    然后在分平台启动的时候,加载Xamarin.Forms之前对这个 MySoapServiceManager全局静态变量赋值,如在Android平台的MainActivty.cs中初始化中添加:


Schedule.App.MySoapServiceManager =new SyncService();//使用Web服务
    这样加载Xamarin.Forms前,接口内的方法都已经实现了。调用的时候,直接调用静态属性下面的方法即可,比如:


int r = App.MySoapServiceManager.UploadClass(ScheduleName, App.GetSerializedBytes(MyContentPage.MySchedule)).Result;
    这样,虽然不同平台实现WebService代码是不同的,但通过注入,在Xamarin.Forms中调用的方法是统一的。Xamarin主要使用了接口和全局静态变量来实现这样的效果。

    最后附上windows下的SyncService有什么不同,对比上文Android的。

    class SyncService : ISoapService
    {

        kechengbiaoSoapClient client;

        public SyncService()
        {
            client = new kechengbiaoSoapClient();
        }

        async public Task<byte[]> DownloadClassById(int id)
        {
            DownloadClassByIdResponse x = client.DownloadClassByIdAsync(id).Result;
            return x.DownloadClassByIdResult;
        }

        async public Task<byte[]> DownloadClassByName(string name)
        {
            DownloadClassByNameResponse x = client.DownloadClassByNameAsync(name).Result;
            return x.DownloadClassByNameResult;
        }

        public Task<int> GetDocumentLenById(int id)
        {
            return GetDocumentLenById(id);
        }

        public Task<int> GetDocumentLenByName(string name)
        {
            return GetDocumentLenByName(name);
        }

        async public Task<int> UploadClass(string name, byte[] bytes)
        {
            uploadclassResponse x = client.uploadclassAsync(name, bytes).Result;
            return x.uploadclassResult;
        }
    }
·END·

作者:songshizhao 发表于:2017-05-02T09:37:14 访问量:1541