虽然xamarin.android/ios 均支持右键添加web引用方式引用webservices,但是xamarin.forms不支持此方式,而如果android/ios各做一套采用抽象方式实现则工程巨大,且耦合性太强。故决定采用http方式请求webservices。

废话不说上干货:

  1. Webservices 端改造

    1.  [System.Web.Script.Services.ScriptService]为支持jquery 或者 其他 http 调用必须放开注释,如没有此特性将不能调用;
    2.  [ScriptMethod(ResponseFormat = ResponseFormat.Json)] webservices 默认返回xml格式 为了增加 json格式返回增加此特性;
    3. UseHttpGet = true 特别注意此点增加此特性则允许httpget访问,不增加则只允许post访问此为单向指定。

      建议 如果指定需要参数传递的方法建议使用post方式如果使用get方式会各种报错如 无效的json基元、参数'xx'缺少值。当然首先你要确认你的 jquery data 格式正确。

             
       

      测试代码如下:

using System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Web;

using System.Web.Services;

using System.Web.Services.Protocols;

using System.Web.Script.Services;

       
 

namespace NeuHuiju.APF.MES.WebUI

{

    ///
<summary>

    /// WebService_wzc 的摘要说明

    ///
</summary>

    [WebService(Namespace = "http://tempuri.org/")]

    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

    [ToolboxItem(false)]

    [System.Web.Script.Services.ScriptService]

    public
class
WebService_wzc : System.Web.Services.WebService

    {

       
 

        ///
<summary>

        ///
有参方法POST请求支持

        ///
</summary>

        ///
<param name="lan"></param>

        ///
<returns></returns>

        [WebMethod]

        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]

        public
string HelloWorld(string lan)

        {

            if (lan != "")

                return lan.ToString();

            else

                return
"Hello World";

        }

       
 

        ///
<summary>

        ///
无参方法 GET请求支持

        ///
</summary>

        ///
<returns></returns>

        [WebMethod]

        [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]

        public
string World()

        {

            return
"ceshi";

        }

    }

  1. Web.config改造

    <system.web>

<webServices>

            <protocols>

                <add
name="HttpGet"/>

                <add
name="HttpPost"/>

                <add
name="HttpSoap"/>

                <add
name="Documentation"/>

            </protocols>

        </webServices> 

增加webservices的请求支持。允许采用httpget、httppost方式 

 <system.webServer>

<handlers>

   <add
name="ScriptHandlerFactory"
verb="*"
path="*.asmx"
preCondition="integratedMode"
type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

            <add
name="ScriptHandlerFactoryAppServices"
verb="*"
path="*_AppService.axd"
preCondition="integratedMode"
type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

            <add
name="ScriptResource"
verb="GET,HEAD"
path="ScriptResource.axd"
preCondition="integratedMode"
type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

 增加webservices的请求支持。此节点为System.Web.Script.Services.ScriptService提供支持 如缺少会报错。大多数500错误均可以检查此节点是否添加。

     要求iis采用集成模式,不能使用经典。 (如果2.0)

  1. Web端调试 jquery

    为了便于测试新建html页面用于监控请求与返回。(为便于调试整理html代码用于测试,html必须与webservices同项目,否则会有跨域访问的问题。调试浪费精力。)

<!DOCTYPE
html
PUBLIC
"-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html
xmlns="http://www.w3.org/1999/xhtml">

<head>

    <title>无标题页</title>

       
 

    <script
src="Script/jquery-1.4.1.js"
type="text/javascript"></script>

       
 

</head>

<body>

    <input
type="button"
id="ipt1"
value="有参数调用"
/><input
type="text"
id="canshu"
/>

    <input
type="button"
id="Button1"
value="无参数调用"
/>

       
 

    <script
type="text/javascript">

       
 

       function GetInfo() {

           $.ajax({

               url: "Webservice/MES/WebService_wzc.asmx/HelloWorld",

               contentType: "application/json; charset=gb2312",

               dataType: "json",

               type: "POST",

               data:"{lan:'"+$('#canshu').val()+"'}",

               dataType: "json",

               success: function (data) {

                    alert(data.d);

               }

           });

       }

       
 

       function GetWord() {

           $.ajax({

               url: "Webservice/MES/WebService_wzc.asmx/World",

               contentType: "application/json; charset=gb2312",

               dataType: "json",

               type: "GET",

               //data:"{lan:'"+$('#canshu')+"'}",

               dataType: "json",

               success: function (data) {

                      alert(data.d);

               }

           });

       }

       $('#ipt1').click(function () {

           var res = GetInfo();

       });

                  
 

              
 

       $('#Button1').click(function () {

           var res = GetWord();

       
 

       });

    </script>

       
 

</body>

</html>

       
 

  1. Webclient类

           
     

using BarCode;

using Newtonsoft.Json;

using System;

using System.Collections.Generic;

using System.Diagnostics;

using System.Linq;

using System.Net;

       
 

       
 

namespace BarCode.Droid

{

///
<summary>

/// webclient帮助类

///
</summary>

public
class
WebClient_clr : IWebClient_clr

    {

public WebClient_clr()

{

   
 

}

   
 

///
<summary>

/// 根据参数集合拼凑json提交字符串

///
</summary>

///
<param name="datas"></param>

///
<returns></returns>

private
string CreateDataJson(IDictionary<string, object> datas = null)

{

if (datas == null)

return
string.Empty;

   
 

var namevalues = datas.Select(d =>

string.Format(@"""{0}"":{1}"

, d.Key

, d.Value.GetType().IsValueType

? string.Format(@"""{0}""", (d.Value??"").ToString())

: this.ObjectToJson(d.Value))

).ToArray();

return
string.Format("{{{0}}}", string.Join(",", namevalues));

}

   
 

public
T WebRequest<T>(Uri uri, IDictionary<string, object> datas = null, string method = "POST", string charset = "UTF8")

{

string data = this.CreateDataJson(datas);

   
 

using (WebClient webClient = new
WebClient())

{

//webClient.Encoding = (Encoding)Enum.Parse(typeof(Encoding), charset);

webClient.Headers["Method"] = method.ToString();

webClient.Headers["Content-Type"] = string.Format(@"application/json;charset={0}", charset);

string dwstring;

if ("POST".Equals(method))

dwstring = webClient.UploadString(uri, method, data);

else

dwstring = webClient.DownloadString(uri);

   
 

return JsonConvert.DeserializeObject<T>(dwstring);

}

}

   
 

///
<summary>

/// 异步调用返回结果

///
</summary>

///
<typeparam name="T"></typeparam>

///
<param name="uri"></param>

///
<param name="datas"></param>

///
<param name="method"></param>

///
<param name="charset"></param>

///
<returns></returns>

public
async System.Threading.Tasks.Task<T> WebRequestAsync<T>(Uri uri, IDictionary<string, object> datas = null, string method = "POST", string charset = "UTF8")

{

string data = this.CreateDataJson(datas);

   
 

using (WebClient webClient = new
WebClient())

{

//webClient.Encoding = (Encoding)Enum.Parse(typeof(Encoding), charset);

webClient.Headers["Method"] = method.ToString();

webClient.Headers["Content-Type"] = string.Format(@"application/json;charset={0}", charset);

string dwstring;

if ("POST".Equals(method))

dwstring = await webClient.UploadStringTaskAsync(uri, method, data);

else

dwstring = await webClient.DownloadStringTaskAsync(uri);

   
 

return JsonConvert.DeserializeObject<T>(dwstring);

   
 

}

}

   
 

   
 

public
void WebRequestCompleted<T>(Uri uri, IDictionary<string, object> datas = null, string method = "POST", string charset = "UTF8", Action<T> RunT = null)

{

string data = this.CreateDataJson(datas);

   
 

using (WebClient webClient = new
WebClient())

{

//webClient.Encoding = (Encoding)Enum.Parse(typeof(Encoding), charset);

webClient.Headers["Method"] = method.ToString();

webClient.Headers["Content-Type"] = string.Format(@"application/json;charset={0}", charset);

if ("POST".Equals(method))

{

webClient.UploadStringCompleted += (sender, e) =>

{

var dwstring = e.Result;

if (RunT != null)

RunT(JsonConvert.DeserializeObject<T>(dwstring));

};

webClient.UploadStringAsync(uri, method, data);

}

else

{

webClient.DownloadStringCompleted += (sender, e) =>

{

var dwstring = e.Result;

if (RunT != null)

RunT(JsonConvert.DeserializeObject<T>(dwstring));

};

webClient.DownloadStringAsync(uri);

}

}

}

   
 

   
 

#region 字符串对象序列化--ObjectConvertJson

///
<summary>

/// 字符串对象序列化

///
</summary>

///
<param name="jsonstr"></param>

///
<returns></returns>

public
T ObjectConvertJson<T>(string jsonstr)

{

try

{

if (string.IsNullOrEmpty(jsonstr) || jsonstr == "{}" || jsonstr == "Token String in state Start would result in an invalid JavaScript object.")

return
default(T);

if (!typeof(T).Name.Equals("Object"))//不等于动态类型

return JsonConvert.DeserializeObject<T>(jsonstr);

   
 

return
default(T);

}

catch (Exception ex)

{

Debug.Print(ex.Message);

throw
new
NotImplementedException(jsonstr + "\r\n+" + ex.Message);

}

}

#endregion

   
 

#region 对象序列化json-ObjectToJson

///
<summary>

/// ObjectToJson 对象序列化 返回json

///
</summary>

///
<param name="obj"></param>

///
<returns></returns>

public
string ObjectToJson(object obj)

{

return JsonConvert.SerializeObject(obj);

}

#endregion

}

}

  1. 调用

    string turl = url + "/GetServiceDateTime";

    string sss = CommCLR.webclient.WebRequest<string>(new
    Uri(turl), method: "GET");//url,get方式获取string

     
 

//post方式提交 参数,key同web function 参数名

string sapurl = url + "/GetPOInforFromSAP";

IDictionary<string, object> datas = new
Dictionary<string, object >();

datas.Add("plantNo", "1000");

datas.Add("poNo", "4500000060");

datas.Add("itemNo", new
UserDto

{

Location = "11",

PlantNo = "1000"

});

     
 

var strss = CommCLR.webclient.WebRequest<string>(new
Uri(sapurl), datas);

Xamarin.Forms-webservices访问的更多相关文章

  1. Xamarin.Forms 简介

    An Introduction to Xamarin.Forms 来源:http://developer.xamarin.com/guides/cross-platform/xamarin-forms ...

  2. 老司机学新平台 - Xamarin Forms开发框架之MvvmCross插件精选

    在前两篇老司机学Xamarin系列中,简单介绍了Xamarin开发环境的搭建以及Prism和MvvmCross这两个开发框架.不同的框架,往往不仅仅使用不同的架构风格,同时社区活跃度不同,各种功能模块 ...

  3. 老司机学新平台 - Xamarin Forms开发框架二探 (Prism vs MvvmCross)

    在上一篇Xamarin开发环境及开发框架初探中,曾简单提到MvvmCross这个Xamarin下的开发框架.最近又评估了一些别的,发现老牌Mvvm框架Prism现在也支持Xamarin Forms了, ...

  4. Xamarin.Forms——WebView技术研究

    在Xamarin中有一些Forms原生不太好实现的内容可以考虑使用HTML.Javascript.CSS那一套前端技术来实现,使用WebView来承载显示本地或网络上的HTML文件.不像OpenUri ...

  5. Xamarin.Forms——尺寸大小(五 Dealing with sizes)

    如之前所见的大量可视化元素均有自己的尺寸大小: iOS的状态栏高度为20,所以我们需要调整iOS的页面的Padding值,留出这个高度. BoxView设置它的默认宽度和高度为40. Frame的默认 ...

  6. Xamarin.Forms入门学习路线

    Xamarin 介绍 Xamarin是一套跨平台解决方案,目的是使用C#语言创造原生的iOS,Android,Mac和Windows应用. Xamarin的三个优势: Xamarin App拥有原生A ...

  7. Xamarin.Forms WebView

    目前本地或网络的网页内容和文件加载 WebView是在您的应用程序显示Web和HTML内容的视图.不像OpenUri,这需要用户在Web浏览器的设备上,WebView中显示您的应用程序内的HTML内容 ...

  8. 自定义xamarin.forms Entry 背景色以及边框

    创建   一个Xamarin.Forms自定义控件.     自定义Entry控件可以通过继承来创建Entry控制,显示在下面的代码示例: public class MyEntry : Entry { ...

  9. Xamarin.Forms App Settings

    配合James Montemagno的Component [Settings Plugin],实现Xamarin.Forms的设置. 更新系统配置且不需要进行重启app. 方式一xml Xamarin ...

  10. Xamarin.Forms 3.0的新特性

    近期因为工作关系开始使用Xamarin,翻译了两篇国外的介绍3.0新特性的文章,供大家参考. 第一篇文章来自Xamarin官网,原文地址:https://blog.xamarin.com/xamari ...

随机推荐

  1. WORLD PROBLEMS

    World中遇到到一些问题     1. 由于文件许可权错误,word无法完成保存操作 我的选择另存为有效,没有安装卡巴斯基8.0(Kaspersky Internet Security 8.0.0. ...

  2. qt之treeview例子

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' from PyQt4.Qt import * from PyQt4. ...

  3. C primer plus 读书笔记第九章

    本章的标题是函数.C的设计原则是把函数作为程序的构成模块. 1.函数概述 函数的定义:函数是用于完成特定任务的程序代码的自包含单元. 使用函数的原因:1.函数的使用可以省去重复代码的编写.2.使得程序 ...

  4. vs2008打包公布程序

    vs2008打包公布程序 一vs2008中新建 安装项目,确定(新建 安装向导 也能够) 二.加入内容 1.加入主要内容: 应用程序目录=>右键=>加入=>文件,找到须要的文件,包含 ...

  5. QP01 BAPI、QP02 BDC

    近期在改动一个检验计划分配的一个程序.上网查了一些资料,分别对QP01检验计划创建.改动QP02.删除物料等操作.分享一下. 一.QP01 BAPI BAPI_INSPECTIONPLAN_CREAT ...

  6. 27个Jupyter Notebook使用技巧及快捷键(翻译版)

    Jupyter Notebook Jupyter Notebook 以前被称为IPython notebook.Jupyter Notebook是一款能集各种分析包括代码.图片.注释.公式及自己画的图 ...

  7. asp.net设置元素css的属性

    controls.style.Add("css名称","css值") 添加class规则 control.cssclass="str_cssname& ...

  8. congos 日期控件的简单使用

    congos 添加html的标签,然后写上js的代码,这段代码的功能是得到前一天的日期. <input type="button" value="查询" ...

  9. 关于oracle dblink的知识。

    create database link WZGLconnect to MMCSG_GX(用户名)using '(description=(address_list=(address=(host=xx ...

  10. AFNetworking3.0出现Error Domain=com.alamofire.error.serialization.response Code=-1016 "Request failed: unacceptable

    在发送请求后一直报错, 浏览器解析却没有问题, 所以基本可以确定是AFNetworking的问题 下面是解决方法: AFHTTPSessionManager *manager = [AFHTTPSes ...