WebService用来提供数据给其他程序使用,与一般处理程序(ashx)功能类似,一般情况下,WebService主要用来为外部应用程序提供数据,如果是内部应用程序,则主要使用一般处理程序来完成。需要学习WebService的可以提前了解一下WCF。
这里我们重点介绍下ASP.NET中WebService的使用。
-
ASP.NET中WebService的创建
在Visual Studio中创建空的Web应用程序,然后在工程中添加Web服务(asmx)即可。/// <summary> /// WebServiceTest 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 [System.Web.Script.Services.ScriptService] public class WebServiceTest : System.Web.Services.WebService { //通过Description来对方法进行介绍,后续会生成到WebService浏览页面中 [WebMethod(Description = "Hello方法")] public string HelloWorld() { return "Hello World"; } //该方法可以将结果以XML的形式进行返回,如果直接通过引用服务的方式,则直接返回结果 [WebMethod] public string AddTest(int a,int b) { return (a + b); } //该方法用于外部HTTP请求,不能通过应用服务的方式获取结果,这里直接返回的是Json格式的字符串 [WebMethod] public void AddTestWithJson(int a,int b) { Context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(a + b)); Context.Response.End(); }
完成上述代码后,直接通过IIS进行发布。
发布完成后,我们可以通过访问相关地址来查看和测试编写的WebService。
-
WebService在其他网页/应用中的调用
其他应用程序在需要使用WebService时,可以有两种方法:
(1)添加服务引用
可以自定义命名空间,通过命名空间来进行相关调用。
服务添加完成后,可以直接在代码中对当前服务中的相关函数进行调用。ServiceReference2.WebServiceTestSoapClient serviceTestSoapClient = new ServiceReference2.WebServiceTestSoapClient(); string a = serviceTestSoapClient.AddTest(1, 2);
(2)Ajax请求
当用户进行开发的程序不支持服务添加引用时,需要通过HTTP请求的方式来完成对数据的请求。
要想解决Ajax的跨域请求问题,需要对我们发布的网站进行HTTP头的添加。<system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*"/> <add name="Access-Control-Allow-Headers" value="Content-Type"/> <add name="Access-Control-Allow-Methods" value="GET,POST,PUT,DELETE,OPTIONS"/> </customHeaders> </httpProtocol> </system.webServer>
通过在发布网站的Web.config文件中添加上述代码来解决浏览器中CORS跨域限制。
在前端页面中可以通过以下代码来获取相关数据。//该方法请求后返回的是经过解析的XML function GetWebServiceResult() { $.ajax({ type: "POST", //访问WebService使用Post方式请求 url: "http://localhost:8086/WebServiceTest.asmx/AddTest", //调用WebService的地址和方法名称组合 data: "{a:1,b:2}", //这里是要传递的参数,格式为 data: "{paraName:paraValue}" dataType: 'json', success: function(result) { alert(result.d); } }); }
//该方法直接返回的是Json字符串 function GetWebServiceResult() { $.ajax({ type: "GET", url: "http://localhost:8086/WebServiceTest.asmx/AddTestWithJson?a=1&b=2", success: function(result) { alert(result); } }); }
-
WebService在Unity中的调用
如果我们需要在Unity中调用WebService,需要在Unity所在文件夹/Unity/Editor/Data/Mono/lib/mono/2.0下找到System.Web.dll、System.Web.Services.dll这两个程序集,将其拷到你的Unity工程下的Plugins文件夹中,Unity会自动添加对这些程序集的引用
以管理员的身份运行CMD命令行程序,进入到System32文件夹,输入命令行进行相关WebService代码生成。wsdl http://localhost:55222/WebServiceTest.asmx
生成完成后到指定目录将相关代码拷贝到Unity目录中。
通过以下代码对相关WebService方法进行调用即可。private void Start() { WebServiceTest webServiceTest = new WebServiceTest(); string a = webServiceTest.AddTest(1, 2); text.text = a; }
-
WebService在Unity的WebGL中的调用
因为WebGL中不支持对WebService的直接引用,我们可以通过WebRequest的方式来对相关服务进行请求并获取结果。public Text text; private void Start() { StartCoroutine(GetResult()); } IEnumerator GetResult() { using (UnityWebRequest unityWebRequest = UnityWebRequest.Get("http://localhost:8086/WebServiceTest.asmx/AddTestWithJson?a=1&b=2")) { yield return unityWebRequest.Send(); if (unityWebRequest.isNetworkError || unityWebRequest.isHttpError) { Debug.Log(unityWebRequest.error); } else { // Show results as text Debug.Log(unityWebRequest.downloadHandler.text); // Or retrieve results as binary data byte[] results = unityWebRequest.downloadHandler.data; text.text = unityWebRequest.downloadHandler.text; } }
发布WebGL进行测试。
这里再简单介绍一下WCF,WCF相当于WebService的升级版,支持多种通信协议。
在Visual Studio中可以创建WCF服务应用程序,创建完成后新建自己的WCF服务(支持Ajax)
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class MyWcfServiceTestWithAjax
{
// 要使用 HTTP GET,请添加 [WebGet] 特性。(默认 ResponseFormat 为 WebMessageFormat.Json)
// 要创建返回 XML 的操作,
// 请添加 [WebGet(ResponseFormat=WebMessageFormat.Xml)],
// 并在操作正文中包括以下行:
// WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";
[WebGet]
[OperationContract]
public string DoWork()
{
// 在此处添加操作实现
A a = new A
{
name = "1111",
age = "222"
};
return Newtonsoft.Json.JsonConvert.SerializeObject(a);
}
// 在此处添加更多操作并使用 [OperationContract] 标记它们
}
public class A
{
public string name;
public string age;
}
运行后就可以在其他页面中进行Ajax请求了。
function GetWcfResult() {
$.ajax({
type: "GET",
url: "http://localhost:56943/MyWcfServiceTestWithAjax.svc/DoWork",
success: function(result) {
alert(result.d);
}
});
}
如果涉及到跨域问题同样需要设置Web.config文件中的HTTP响应标头信息。