ASP.NET中的WebService应用及在Unity的WebGL中的使用

WebService用来提供数据给其他程序使用,与一般处理程序(ashx)功能类似,一般情况下,WebService主要用来为外部应用程序提供数据,如果是内部应用程序,则主要使用一般处理程序来完成。需要学习WebService的可以提前了解一下WCF。
这里我们重点介绍下ASP.NET中WebService的使用。

  1. 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。
    ASP.NET中的WebService应用及在Unity的WebGL中的使用

  2. WebService在其他网页/应用中的调用
    其他应用程序在需要使用WebService时,可以有两种方法:
    (1)添加服务引用
    ASP.NET中的WebService应用及在Unity的WebGL中的使用
    可以自定义命名空间,通过命名空间来进行相关调用。
    服务添加完成后,可以直接在代码中对当前服务中的相关函数进行调用。

        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跨域限制。
    ASP.NET中的WebService应用及在Unity的WebGL中的使用
    在前端页面中可以通过以下代码来获取相关数据。

    //该方法请求后返回的是经过解析的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);
                    }
            });
        }
    
  3. WebService在Unity中的调用
    如果我们需要在Unity中调用WebService,需要在Unity所在文件夹/Unity/Editor/Data/Mono/lib/mono/2.0下找到System.Web.dll、System.Web.Services.dll这两个程序集,将其拷到你的Unity工程下的Plugins文件夹中,Unity会自动添加对这些程序集的引用
    ASP.NET中的WebService应用及在Unity的WebGL中的使用
    以管理员的身份运行CMD命令行程序,进入到System32文件夹,输入命令行进行相关WebService代码生成。

    wsdl http://localhost:55222/WebServiceTest.asmx
    

    ASP.NET中的WebService应用及在Unity的WebGL中的使用
    生成完成后到指定目录将相关代码拷贝到Unity目录中。
    ASP.NET中的WebService应用及在Unity的WebGL中的使用
    通过以下代码对相关WebService方法进行调用即可。

     private void Start()
        {
            WebServiceTest webServiceTest = new WebServiceTest();
            string a = webServiceTest.AddTest(1, 2);
            text.text = a;
        }
    
  4. 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响应标头信息。