給Web Api 再加把柴-讓它更火起來


   WebApi 這兩天被dudu老大炒的老火了,看來我也需要加把柴了,呵呵。

     NLite WebApi 是基於Ndf的服務分發器引擎,並借助Asp.net 的http原生態無狀態協議的基礎上搭建起來的

,NLite Web api 完全無侵入性,不繼承任何基類,只需要簡單的配置即可把業務邏輯自動發不成NLite Web Api 服務, 簡單易用,不廢話,上過程!

     服務端Nlite Web API的實現

     需要准備的工具:Visual Studio 2010, NuGet(這兩天現學了Nuget 包的制作,雖然去年簡單學習並制作了

NLite的包,不過早忘光了,看了dudu老大的WebApi介紹,感覺落伍了,抓緊進行了惡補,總算制作了一個NLite

Web Api的Nuget 包了呵呵,在這里要多謝dudu了)

    1. 新建一個空的ASP.NET Web Application項目。

    

  2. 刪除默認的Global文件(還沒完全學會通過Nuget對Global文件的Merge處理,暫時先把原有的刪掉,然后通過

Nuget用新的內容來替換它)

  3. 通過NuGet 控制台添加NLite Web API的引用:Install-Package NLite.WebApi

  4. 通過Nuget,已經自動的把系統配置完畢,並且內置了幾個Demo,還有Jquery客戶端的調用示例(也是WebApi的

測試工具簡單易用又方便,試試就知道了,呵呵),下面是自動生成的代碼和Demo例子

Global文件的配置代碼:

  

  Service文件夾(即Asp.net WebApi 中的Controllers文件夾)以及Service 類(相當於Controller,如HelloService

,相當於HelloController,服務名:hello)

     

 

  HelloService 的代碼(HelloService的類上添加了Component標簽,是讓DI容器自動注冊用的)

  

  5. F5 運行,並輸入(系統自動調用HelloService的Index方法,參數name的值為"netcasewqs"

  

  備注:

  code 是服務器返回的狀態碼,code=1是成功,反之失敗,data 的內容就是服務返回的真正結果"Hello netcasewqs"

 

   剛才是通過Url直接來訪問WebApi,現在通過系統自帶的工具來測試

   1. 在瀏覽器中鍵入http://localhost:2955/metadata/index.htm,系統會自動的把所有的Service(Controller)枚舉出來,如圖

   

  2. 選擇一個Service(Controller)HelloService,系統自動的把該服務下所有符合協議的方法都枚舉出來,如圖

   

   3. 選擇一個方法,系統會自動的彈出一個表單

   

  4.鍵入參數並單擊“點擊查看運行結果”按鈕

    

  JQuery調用示例代碼(獲取所有的服務列表代碼)

  1.客戶端WebApi測試工具的前端代碼是靜態網頁html+Jquery,后端的MetadataService如下:

   [Component]
    public class MetadataService
    {
        IServiceDescriptorManager ServiceDescriptorManager;
        public MetadataService(IServiceDescriptorManager serviceDescriptorManager)
        {
            ServiceDescriptorManager = serviceDescriptorManager;
        }

        public class ServiceModel
        {
            public string name;
            public string desc;
        }

        public ServiceModel[] Index()
        {
            return ServiceDescriptorManager.ServiceDescriptors
                .Select(s => new ServiceModel { name = s.ServiceName, desc = s.Description }).ToArray();
        }

        public class OperationModel
        {
            public string name;
            public string desc;
        }

        public class ParameterModel
        {
            public string name;
            public string type;
            public string desc;
        }

        public OperationModel[] Actions(string serviceName)
        {
            var sd = ServiceDescriptorManager.GetServiceDescriptor(serviceName);
            if (sd == null)
                return new OperationModel[0];
            return sd.Select(p => new OperationModel { name = p.OperationName, desc = p.Description }).ToArray();
        }

        public ParameterModel[] Args(string service, string action)
        {
            var sd = ServiceDescriptorManager.GetServiceDescriptor(service);
            if (sd == null)
                return new ParameterModel[0];
            var op = sd[action];
            if (op == null)
                return new ParameterModel[0];
            return op.Method.GetParameters()
                .Select(p => new ParameterModel { name = p.Name, type = p.ParameterType.FullName, desc = GetParameterDescription(p) })
                .ToArray();
        }

        private static string GetParameterDescription(ParameterInfo p)
        {
            var descAttr = p.GetAttribute<DescriptionAttribute>(true);
            return descAttr != null ? descAttr.Description : null;
        }
    }

  2. WebApi客戶端工具-服務列表頁面 Index.htm,其它的頁面略

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Api 服務列表</title>
    <link href="Style.css" rel="stylesheet" type="text/css" />
    <script src="JScript.js" type="text/javascript"></script>
    <script src="../Scripts/jquery-1.4.1.js" type="text/javascript"></script>
    <script type="text/javascript" language="javascript">
        $(document).ready(function () {
            //獲得站點路徑(例如:http://www.baidu.com)
            var host = GetHost();
            var url = host + "/api/Metadata/Index.aspx";
            $.post(url, function (result) {
                if (result.code == 1) {
                    $.each(result.data, function (i, field) {
                        var content_li = "<li>";
                        var content_a = "<a href='actions.htm?op=" + field.name + "'>" + FirstToUpper(field.name) + "</a>";
                        var content_span = "";
                        if (field.desc != null) {
                            content_span = "<span id='content_span'><br/>" + field.desc + "</span>";
                        }
                        var content_end_li = "</li>";
                        var content = content_li + content_a + content_span + content_end_li;

                        $("ul").append(content);
                    });
                }
                else {
                    alert(result.message);
                }
            });
        });
    </script>
</head>
<body>
    <div id="content">
        <p class="heading1">
            服務列表</p>
        <br />
        <ul>
        </ul>
    </div>
</body>
</html>

 

  示例代碼下載:

  http://files.cnblogs.com/netcasewqs/NdfWebApiDemo.zip

 總結:Asp.net WebApi 非常強大,吸收了Asp.net mvc很多精髓的設計思想,NLite WebApi 是構建在Ndf的服務分發器的基礎上進行構造的,Ndf服務器分發器的一個宗旨是業務邏輯的高內聚,高復用性,高松耦合和便捷的可測試性為宗旨,支持嵌入式和分布式部署,詳情見官網解釋http://ndf.codeplex.com/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM