虽然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. C#中问号的使用

    1. 可空类型修饰符(?): 引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空. 例如:string str=null; 是正确的,int i=null; 编译器就会报错. 为了使值 ...

  2. Citrix 服务器虚拟化之十三 Xenserver虚拟机内存优化与性能监控

    Citrix 服务器虚拟化之十三   Xenserver虚拟机内存优化与性能监控 XenServer的DMC通过自动调节运行的虚拟机的内存,每个VM分配给指定的最小和最大内存值之间,以保证性能并允许每 ...

  3. 微信公众账号【iOSDevTip】推出新栏目【看大牛】

    首先你须要关注微信公众账号[iOSDevTip] 基于微信公众平台数据分析.非常easy发现.移动端project师都喜欢关注互联网创业资讯.都说.一个不关注互联网创业的iOS开发不是一个合格的互联网 ...

  4. [CSS3] Interactive Pseudo-Classes :link :visited :hover :active

    The interactive pseudo-classes for links (and buttons) allow us to make sure the user knows what ele ...

  5. SHELL网络爬虫实例剖析--转载

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://nolinux.blog.51cto.com/4824967/1552472 前天 ...

  6. Cross-origin resource sharing--reference

    Cross-origin resource sharing (CORS) is a mechanism that allows many resources (e.g., fonts, JavaScr ...

  7. Target runtime Apache Tomcat v6.0 is not defined. phyy Unknown Faceted Project Problem

    Description Resource Path Location TypeTarget runtime Apache Tomcat v6.0 is not defined. phyy Unknow ...

  8. Java基础知识强化78:正则表达式之获取功能(案例)

    1. 获取下面这个字符串中由三个字符组成的单词. da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu? 2. ...

  9. GSON 示例代码 实用版

    去除所有格式的json字符串 {"data":[{"friend":[{"address":"广州","nam ...

  10. Java类与类之间关系总结

    继承,依赖,关联,聚合,组合 一般来说依赖和关联是类似的,关联是强依赖,聚合和组合是一类,组合属于强聚合. 继承:一般是子类和父类之间的关系,关键字extends 依赖:可以这样记忆,做某件事必须要依 ...