Xamarin.Forms-webservices访问
虽然xamarin.android/ios 均支持右键添加web引用方式引用webservices,但是xamarin.forms不支持此方式,而如果android/ios各做一套采用抽象方式实现则工程巨大,且耦合性太强。故决定采用http方式请求webservices。
废话不说上干货:
Webservices 端改造
- [System.Web.Script.Services.ScriptService]为支持jquery 或者 其他 http 调用必须放开注释,如没有此特性将不能调用;
- [ScriptMethod(ResponseFormat = ResponseFormat.Json)] webservices 默认返回xml格式 为了增加 json格式返回增加此特性;
- 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";
}
}
}
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)
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>
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
}
}
调用
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访问的更多相关文章
- Xamarin.Forms 简介
An Introduction to Xamarin.Forms 来源:http://developer.xamarin.com/guides/cross-platform/xamarin-forms ...
- 老司机学新平台 - Xamarin Forms开发框架之MvvmCross插件精选
在前两篇老司机学Xamarin系列中,简单介绍了Xamarin开发环境的搭建以及Prism和MvvmCross这两个开发框架.不同的框架,往往不仅仅使用不同的架构风格,同时社区活跃度不同,各种功能模块 ...
- 老司机学新平台 - Xamarin Forms开发框架二探 (Prism vs MvvmCross)
在上一篇Xamarin开发环境及开发框架初探中,曾简单提到MvvmCross这个Xamarin下的开发框架.最近又评估了一些别的,发现老牌Mvvm框架Prism现在也支持Xamarin Forms了, ...
- Xamarin.Forms——WebView技术研究
在Xamarin中有一些Forms原生不太好实现的内容可以考虑使用HTML.Javascript.CSS那一套前端技术来实现,使用WebView来承载显示本地或网络上的HTML文件.不像OpenUri ...
- Xamarin.Forms——尺寸大小(五 Dealing with sizes)
如之前所见的大量可视化元素均有自己的尺寸大小: iOS的状态栏高度为20,所以我们需要调整iOS的页面的Padding值,留出这个高度. BoxView设置它的默认宽度和高度为40. Frame的默认 ...
- Xamarin.Forms入门学习路线
Xamarin 介绍 Xamarin是一套跨平台解决方案,目的是使用C#语言创造原生的iOS,Android,Mac和Windows应用. Xamarin的三个优势: Xamarin App拥有原生A ...
- Xamarin.Forms WebView
目前本地或网络的网页内容和文件加载 WebView是在您的应用程序显示Web和HTML内容的视图.不像OpenUri,这需要用户在Web浏览器的设备上,WebView中显示您的应用程序内的HTML内容 ...
- 自定义xamarin.forms Entry 背景色以及边框
创建 一个Xamarin.Forms自定义控件. 自定义Entry控件可以通过继承来创建Entry控制,显示在下面的代码示例: public class MyEntry : Entry { ...
- Xamarin.Forms App Settings
配合James Montemagno的Component [Settings Plugin],实现Xamarin.Forms的设置. 更新系统配置且不需要进行重启app. 方式一xml Xamarin ...
- Xamarin.Forms 3.0的新特性
近期因为工作关系开始使用Xamarin,翻译了两篇国外的介绍3.0新特性的文章,供大家参考. 第一篇文章来自Xamarin官网,原文地址:https://blog.xamarin.com/xamari ...
随机推荐
- 区分width()、css('width')、innerWidth()
#widthTest1 { width: 200px; height: 200px; background-color: #00CCFF; -webkit-box-sizing: border-box ...
- windows 编程—— 使用函数笔记
目录: 创建滚动条 滚动条函数(新老版本) 取得设备内容句柄hdc 设置 hdc 中的属性 画点画线 画填充图形 使用自定义的 画笔 和 画刷 矩形.区域和剪裁 关于GDI映像模式 其他常用的方便计算 ...
- HttpClient封装
package com.exmyth.net; public interface KeyLoadListener { public void onSuccess(byte[] key); // pub ...
- IO-序列化 Serializable Parcelable Object
简介 1.什么是序列化和反序列化 对象的寿命通常随着生成该对象的程序的终止而终止,有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复.我们把对象的这种,能记录自己的状态以便将来再生的能力,叫作 ...
- 一览css布局标准
回顾历史,CSS1于1996.12.17发正式版,它是为辅助HTML的展现效果而生的.1998.5.12,CSS2发正式版.随后发修订版CSS2.1,纠正了CSS2中的一些错误.注意从CSS2起,CS ...
- ASP.NET-FineUI开发实践-8(二)
把上回的做一些改进 1.点击grid2的行改变TriggerBox1的值 var v = $(item).find('.x-grid-cell-Name div.x-grid-cell-inner') ...
- ASP.NET 中的返回按钮的实现【转】
返回上一页的这个东东在我们做项目的时候一般是用于填写完表单后确认的时候,有对原来输入的数据进行修改时用的,或者是因为网站为了方便浏览者而有心添加 的一个东东,一般这种功能的实现在ASP.net中都 ...
- 一位学长的ACM总结(感触颇深)
发信人: fennec (fennec), 信区: Algorithm 标 题: acm 总结 by fennec 发信站: 吉林大学牡丹园站 (Wed Dec 8 16:27:55 2004) AC ...
- grunt -- javascript自动化工具
grunt 是一个基于npm,node.js 用js编写的工具框架,可以自动完成一些重复性的任务(如合并文件,语法检查,压缩代码), grunt拥有庞大的插件库,可以满足各种自动化批处理需求,常用的插 ...
- 你确定你是一个合格的.Net开发人员吗?
做.net开发已有近5年时间,自认掌握的知识比较全面.最近部门需要招人,今天抽空在网上看了一下,发现我了解的还是不够多啊.下面是我大致的罗列了一下作为一名.Net开发人员所需要掌握的只是.看看你是不是 ...