C#开发WebService为例⼦
本⽂参考其它⽂章和⾃⼰解决中间问题的经历记录,以C#开发WebService为例⼦,欢迎探讨:
⼀、C#开发WebService
1. 在visual studio中新建ASP.NET Web服务应⽤程序,取名MyWebService。
2. 删除⾃动⽣成的代码,输⼊以下代码段,包括多个⽅法:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
[WebMethod(Description = "默认的⽅法")]
public string HelloWorld()
{
return "Hello World";
}
[WebMethod(Description = "求和的⽅法")]
public double addition(double i, double j)
{
return i + j;
}
[WebMethod(Description = "求差的⽅法")]
public double subtract(double i, double j)
{
return i - j;
}
[WebMethod(Description = "求积的⽅法")]
public double multiplication(double i, double j)
{
return i * j;
}
[WebMethod(Description = "参数返回中⽂⽅法")]
public string myhello(string name, string department)
{
return "您的姓名:" + name + "<br>" + "您的单位:" + department + "<br>";
}
}
}
初步⽣成后,可以CTRL+F5启动⾃带的调试器测试WebService,查看定义的调⽤⽅法,如下图所⽰:
点击具体的⽅法,可以测试。
调⽤测试结果如下:
⼆、WebService部署
1. 调试通过后发布WebService。
2. 将发布后的⽂件⽬录拷贝的Web服务器(安装有IIS的机器),创建虚拟⽬录,和发布⽹站⼀样,指向该⽬录。如下图:
我们会发现,从远程客户端访问服务器上的WebService能够显⽰,但点击调⽤相关的⽅法时显⽰“只能⽤于来⾃本地计算机的请求”,这时提醒我们还需要在服务器进⾏相关的配置才能让其他机器正常访问该WebService。具体配置⽅法如下:
修改webconfig⽂件,在system.web节点下⾯加⼊下⾯代码?:
<webServices >
<protocols >
<add name="HttpSoap"/>
<add name="HttpPost"/>
<add name="HttpGet"/>
<add name="Documentation"/>
</protocols>
</webServices>
即可实现远程访问webservice。最终效果如图:
三、WebService的调⽤
(1)新建ASP.NET Web应⽤程序,在Default.aspx页⾯中添加控件如下:
(2)添加Web引⽤,Web引⽤名:WebReference。如下图:
(3)添加相关调⽤代码如下:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
WebReference.WebServiceDemo s = new WebReference.WebServiceDemo();
//调⽤WebService的HelloWorld⽅法,返回"HelloWorld",并输出.
Response.Write(s.HelloWorld());
}
protected void btnConvert_Click(object sender, EventArgs e)
{
WebReference.WebServiceDemo s = new WebReference.WebServiceDemo();
//调⽤WebService的ConvertTemperature⽅法,实现温度转换.
labResult.Text = "转换后的温度是:" + s.ConvertTemperature(double.Parse(txtResult.Text));
}
}
(4)测试结果如下:
<html>
<title>Call webservice with and xmlhttp.</title>
<body>
<mce:script language="javascript"><!--
// --></mce:script>
<input type="button" value="CallWebserviceByGet" onClick="RequestByGet(null)">
<input type="button" value="CallWebserviceByPost" onClick="RequestByPost('Zach')">
</body>
</html>
其中webservice的地址可以换成已经发布好的远程服务器地址即可,该代码未经测试,正确性不予保证。
3.通过js简单调⽤webservice(经过测试,能够运⾏,但IE9不兼容)
(1)客户端代码如下:
//第⼀个参数是webservice的url,后⾯是名称
function calltest()
{
//如果该webservice有参数的话,在括号后加逗号分隔。
intCallID=hello.MyName.callService("myhello",ElementsByName("name")
调用webservice服务[0].ElementsByName("department")[0].value); //no param
}
function callback_result()
{
if (()&&(intCallID==sult.id))
{
var xfaultcode = de;
var xfaultstring = Detail.string;
var xfaultsoap = Detail.raw;
// Add code to output error information here
alert(xfaultstring);
}
else
{
hello.innerHTML+= "测试调⽤结果为:<br>"+ sult.value;
}
}
</script>
</head>
<body οnlοad="init();">
<p> </p>
<label>姓名:
<input type="text" name="name" id="name" />
<br />
单位:
<input type="text" name="department" id="department" />
<br />
</label>
<div id="hello" onresult="callback_result();" ></div>
<input name="button" type="button" onClick="calltest();" value="调⽤测试" />
</body>
</html>
调⽤测试界⾯如图:
填⼊参数,点击按钮,页⾯DIV刷新变化为:
通过javascript和webservice.htc附加到HTML元素(例如DIV)调⽤法有以下⼏个注意问题:
a.由于js不能跨域调⽤,⽽导致调⽤页⾯和webservice所在⽹站不在同⼀服务器会导致问题,解决⽅法查相关资料如下:
出于安全考虑禁⽌跨域调⽤其他页⾯的对象,因此也导致了js使⽤跨域的web service成为问题。解决⽅法:
1.设置document.domain
前提条件:两个页⾯同属于⼀个基础域(例如都是xxx,或是xxx);同⼀协议(例如都是http);同⼀端⼝(例如都是80)。⽅法:设置两个页⾯的document.domain都设置为⾃⼰所在的基础域名。
例⼦:⾥⾯的⼀个页⾯需要调⽤⾥的⼀个对象,则将两个页⾯的document.domain都设置为xxx,就可以了。
2.在服务器端设置代理
跨域的请求同样发送到本地服务器端,由服务器端的代理来请求相应的数据,然后发送给浏览器端。这样实际上浏览器端的所有请求都是发到相同的域,在服务器端代理的帮助下,实现了跨域的能⼒。
3.使⽤标签
当同时具有两个域的开发权限时就可以使⽤该⽅法了,原理是JS⽂件注⼊,在本域内的a内⽣成⼀个JS标签,SRC指向请求的另外⼀个域的某个页⾯b,b返回数据即可,可以直接返回JS的代码。
b.利⽤JS调⽤webservice需要⽤到微软的webservice.htc⽂件,可以在微软官⽅⽹站下载到,放到和调⽤页⾯同路径即可。例如:<div
id="hello" onresult="callback_result();" ></div>
其它诸如返回多值、例如数组等,兼容性问题(经测试IE9不兼容js调⽤⽅法),更⾼级应⽤⽅法还有待进⼀步应⽤,此⽂章仅兴趣测试⽽写,不周之处,⼝下留情!当然也欢迎⽹友多多指导,告以其中谬误和原理!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论