jQuery呼び出しRESTful WCF例(GETメソッド/POSTメソッド)

10524 ワード

くだらないことを言わないで、テーマに直行しましょう.
wcf端子:
近年流行しているrestfulは、ajaxに呼び出されるようにするとともに、restfulスタイルのuriをサポートするために、Ajax-enabled Wcf Serviceを作成した後、svcファイルを手動で変更し、Factoryを指定する必要があります.
<%@ ServiceHost Language="C#"Debug="true"Service="ajaxSample.HelloWorld"CodeBehind="HelloWorld.svc.cs"Factory="System.ServiceModel.Activation.WebServiceHostFactory"%>
注意:Factoryを追加しないと、wcfはhttp://localhost/helloWorld.svc/Hello/person/nameのようなrestfulで直接アクセスできません.
同時にwebも削除します.configのは類似しています.
                                                                               
さて、コードの書き込みを開始します.wcf呼び出しにはGET/POSTの2つの方法があります.次に、いくつかの一般的な状況を例に挙げてみましょう.
using System.Collections.Generic;

using System.ServiceModel;

using System.ServiceModel.Activation;

using System.ServiceModel.Web;



namespace ajaxSample

{

    [ServiceContract(Namespace = "http://yjmyzz.cnblogs.com/")]

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

    public class HelloWorld

    {

        

        /// <summary>

        ///   Post Restful  

        /// </summary>

        /// <param name="person"></param>

        /// <param name="welcome"></param>

        /// <returns></returns>

        [OperationContract]

        [WebInvoke(Method = "POST", UriTemplate = "PostRestfulTest/{person}/{welcome}", ResponseFormat = WebMessageFormat.Json)]

        public List<string> PostRestfulTest(string person,string welcome)

        {

            List<string> result = new List<string>();



            result.Add("PostRestfulTest -> from server:");

            result.Add(person);

            result.Add(welcome);

            return result;

        }



        /// <summary>

        ///   Get Restful  

        /// </summary>

        /// <param name="person"></param>

        /// <param name="welcome"></param>

        /// <returns></returns>

        [OperationContract]

        [WebInvoke(Method = "GET", UriTemplate = "GETRestfulTest/{person}/{welcome}", ResponseFormat = WebMessageFormat.Json)]

        public List<string> GETRestfulTest(string person, string welcome)

        {

            List<string> result = new List<string>();



            result.Add("GETRestfulTest -> from server:");

            result.Add(person);

            result.Add(welcome);

            return result;

        }



        /// <summary>

        ///   Get Post Restful  

        /// </summary>

        /// <param name="person"></param>

        /// <param name="welcome"></param>

        /// <returns></returns>

        [OperationContract]

        [WebInvoke(Method = "*", UriTemplate = "RestfulTest/{person}/{welcome}", ResponseFormat = WebMessageFormat.Json)]

        public List<string> RestfulTest(string person, string welcome)

        {

            List<string> result = new List<string>();



            result.Add("RestfulTest -> from server:");

            result.Add(person);

            result.Add(welcome);

            return result;

        }





        /// <summary>

        ///   Post     ( :Post  ,BodyStyle     WrappedRequest Wrapped)

        /// </summary>

        /// <param name="person"></param>

        /// <param name="welcome"></param>

        /// <returns></returns>

        [OperationContract]

        [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle=WebMessageBodyStyle.WrappedRequest)]

        public List<string> PostTest(string person, string welcome)

        {

            List<string> result = new List<string>();



            result.Add("PostRestfulTest -> from server:");

            result.Add(person);

            result.Add(welcome);

            return result;

        }



        /// <summary>

        ///   Get     

        /// </summary>

        /// <param name="person"></param>

        /// <param name="welcome"></param>

        /// <returns></returns>

        [OperationContract]

        [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json)]

        public List<string> GETTest(string person, string welcome)

        {

            List<string> result = new List<string>();



            result.Add("GETTest -> from server:");

            result.Add(person);

            result.Add(welcome);

            return result;

        }



        



        

    }

}


  
jQuery呼び出しコード:
    <script type="text/javascript">

        $().ready(function () {





            $.post("HelloWorld.svc/PostRestfulTest/111/222", function (data) {

                alert("PostRestfulTest    ,    :" + data);

            })



            $.get("HelloWorld.svc/GETRestfulTest/333/444", function (data) {

                alert("GETRestfulTest    ,    :" + data);

            })



            $.get("HelloWorld.svc/RestfulTest/555/666", function (data) {

                alert("RestfulTest GET      ,    :" + data);

            })





            $.post("HelloWorld.svc/RestfulTest/777/888", function (data) {

                alert("RestfulTest POST      ,    :" + data);

            })





            $.get("HelloWorld.svc/GETTest", { person: "aaa", welcome: "bbb" }, function (data) {

                alert("GETTest     ,    :" + data);

            });





            $.ajax({

                url: "HelloWorld.svc/PostTest",

                type: "POST",

                contentType: "application/json",

                data: '{"person":"ccc","welcome":"ddd"}',

                dataType: "html",

                success: function (data) { alert("PostTest    ,    :" + data); }

            });

        })

    </script>


WCF曝露の方法では、ユーザ名/ユーザIDなどの機密情報をパラメータとして使用する必要がある場合があります.この場合、jsでwcfを呼び出すと、クライアントにこの情報が漏れる可能性があります.このようなシーンでは、サービス側のashxで中継することもよくあります.
TestService.svc
using System.ServiceModel;



namespace ashx_jQuery

{

     [ServiceContract]

    public class TestService 

    {

         /// <summary>

         ///              

         /// </summary>

         /// <param name="userId"></param>

         /// <param name="month"></param>

         /// <returns></returns>

         [OperationContract]

        public double GetSalary(int userId,int month)

        {

            if (month == 1)//      

            {

                return 5000;

            }

            else 

            {

                return 1000;

            }

        }

    }

}


 AjaxProcess.ashx
using System.Web;



namespace ashx_jQuery

{

    /// <summary>

    /// Summary description for AjaxProcess

    /// </summary>

    public class AjaxProcess : IHttpHandler

    {



        public void ProcessRequest(HttpContext context)

        {

            context.Response.ContentType = "text/plain";

            string month = context.Request["month"];



            TestService wcf = new TestService();

            double salary = wcf.GetSalary(GetUserId(), int.Parse(month));

            context.Response.Write("{salary:" + salary + "}");

        }





        /// <summary>

        ///        ID

        /// </summary>

        /// <returns></returns>

        private int GetUserId() 

        {

            return 1;

        }



        public bool IsReusable

        {

            get

            {

                return false;

            }

        }

    }

}


jQuery呼び出し:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="ashx_jQuery._default" %>



<!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 runat="server">

    <title>jQuery ashx Sample</title>

    <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.1.min.js"></script>

    <script type="text/javascript">

        $().ready(function () {

            $("#btnTest").click(function () {

                $.post(

                    "AjaxProcess.ashx",

                    { month:1 },

                    function (e) {

                        var d = eval("(" + e + ")");

                        alert(d.salary);

                    }, "html");

            })

        })

    </script>

</head>

<body>

    <form id="form1" runat="server">

        <input type="button" value="GetSalary" id="btnTest"/>

    </form>

</body>

</html>


サンプルコード:
http://files.cnblogs.com/yjmyzz/jquery_ajax_wcf_rest.zip