为您推荐:
精华内容
最热下载
问答
  • WCF开发实战   一、 服务器应用开发 (一) 创建“WCF服务库” “文件(F)”->“新建项目(P)...”打开新建项目对话框。在左侧的“项目类型”中选择“WCF”,然后再在右侧的“模板”中选择“WCF服务库”。...

    WCF开发实战

     

    一、 服务器应用开发

    ()    创建“WCF服务库

    文件(F)”->“新建项目(P)...”打开新建项目对话框。在左侧的项目类型中选择“WCF”,然后再在右侧的模板中选择“WCF服务库
    在下面的名称文本框中,填写我们要创建的WCF服务库的项目名称“WcfEmployee”


    点击确定,会创建出我们的WCF服务库项目,在解决方案中会自动为我们生成两个类文件“IService1.cs”“Service1.cs”


    这两个类文件是两个WCF示例文件,对我们开发没有什么用处,现在我们删掉这两个文件。

    创建Employee实体类
    解决方案窗口中,我们右击Services项目名,选择添加,再单击

    在弹出的添加新项窗口中,选择,并在名称文本框中写入项名称“Employee.cs”

    为Employee实体类编写代码
     

    using System.Runtime.Serialization;

    namespace WcfEmployee

    {

     [DataContract]

    public class Employee

        {

    [DataMember]

            public string EmployeeId;

    [DataMember]

            public string EmployeeName;

    [DataMember]

            public int EmployeeAge;

        }

    }


    为了保证此类在WCF调用中能够被序列化,我们在Employee类上面加入[DataContract]标签,在每个需要序列化的成员变量上加入[DataMember]标签。这两个标签在使用的进候需要导入using System.Runtime.Serialization命名空间。
    到此为至,我们创建完了需要在服务中传输的复杂的数据类型Employee

    创建服务接口
    创建服务接口,声明对外发布的类和方法。
    解决方案窗口中,我们右击WcfEmployee项目名,选择添加,再单击

    在弹出的添加新项窗口中,选择,并在名称文本框中写入项名称“IEmployeeSrv.cs”


    在此类文件中我们编写服务接口,代码如下:
    using System.Collections.Generic;

    using System.ServiceModel;

     

    namespace WcfEmployee

    {

      [ServiceContract]

    public interface IEmployeeSrv

        {

      [OperationContract]

            void AddEmployees(Employee employee);

    [OperationContract]

            List<Employee> GetAllEmployees();

     [OperationContract]

            void RemoveEmployee(string id);

     

        }

    }

     


    IEmployeeSrv接口上面,我们定义了[ServiceContract]标签,此标签代表此接口及实现此接口的类都是对外发布的Service类,在每个需要对外发布的方法上都加上[OperationContract]标签,以使外部可以访问到此方法。
    [ServiceContract][OperationContract]这两个标签需要导入using System.ServiceModel命名空间。

    创建实现服务接口的类
    实现我们上面声明的服务接口,实现对Employee的添加、删除和检索的具体功能。
    解决方案窗口中,我们右击WcfEmployee项目名,选择添加,再单击

    在弹出的添加新项窗口中,选择,并在名称文本框中写入项名称“EmployeeSrv.cs”


    在此类文件中编写代码实现IEmployeeSrv.cs服务接口。
     

     

    using System.Collections.Generic;

    using System.ServiceModel;

     

    namespace WcfEmployee

    {

     [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]

     

    public class EmployeeSrv:IEmployeeSrv

        {

            List<Employee> _Employee=new List<Employee>();

    public void AddEmployees(Employee employee)

            {

                employee.EmployeeId=Guid.NewGuid().ToString();

                _Employee.Add(employee);

            }

     

    public void RemoveEmployee(string id)

            {

                Employee employee=_Employee.Find(p=>p.EmployeeId==id);

                _Employee.Remove(employee);

            }

     

    public List<Employee> GetAllEmployees()

            {

                return _Employee;

            }

        }

    }


    此类是对IEmployeeSrv接口的具体实现,在此类的上面我们声明了[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]标签,此标签代表这个类采用SingleTone(单类模式)来生成对象。
    使用[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]接口需要导入using System.ServiceModel;命名空间。

     

    app.configService1改为EmployeeSrv.

    运行WCF进行测试。
        VS2008中为我们提供了测试WCF的工具,按F5启动WCF会出现两个东西
        一个是在右下角的托盘图标中会出现WCFSVCHost(WCF服务主机),它为我们在开发时候提供了一个运行WCF的服务器,用来为测试客户端提供WCF服务。


       
       
    另一个是“WCF测试客户端

       
        “
    测试客户端WcfSVCHost中取得WCF服务的元数据,解析为右侧的服务结构树,从这里面我们可以看到此WCF服务为我们提供了一个服务契约“IEmployeeSrv”,此服务契约中对外提供了三个可调用的方法。
        双击AddEmployees()方法,我们可以从右面输入相关的数据然后点击调用,就可以把数据送给WCF服务器,去调用对应的方法了。

    ()   使用IIS发布WCF服务
     上一篇中,我们创建了一个简单的WCF服务,在测试的时候,我们使用VS2008自带的WCFSVCHost(WCF服务主机)发布WCF服务,以便进行测试。这种VS2008内置的WCFSVCHost只适用于开发人员测试的使用,能进行WCF服务部署。这一篇文章中我们来看一下如何在IIS中部发布我们上一篇中做好的WCF服务。

    第一步:打开我们上一篇文章中建立的WCF服务项目。

     

     


    图《1

    第二步:新建WCF服务站点。在解决方案上右击,选择添加”->“新建网站,打开新建网站对话框。在添加新网站对话框中,我们选择“WCF服务,并把网站的名子命名为“BookServiceHost”


    图《2
    建立起来的新的WCF服务站点的结果如下,其中在App_Code文件中自动为我们生成两个类文件:IService.csService.cs。这两个文件对我们来说没有用,我们删掉。

     


    图《3

    第三步:在刚刚创建的WCF服务站点上添加对WCF服务库项目--Services项目的引用。


    图《4

    第四步:配置Service.svc文件。
    双击Service.svc文件,我们可以看到它的声明指示如下:
    <%@ ServiceHost Language="C#" Debug="true" Service="Service" CodeBehind="~/App_Code/Service.cs" %>
    由于在第二步中我们已经把IService.csService.cs两个文件已经删除了,所以这里的声明指示内容修改一下,让这个Service.svc文件的后台代码指向我们上次创建的WCF服务库项目--Services项目中的类,改后的代码如下:
    <%@ServiceHostLanguage="C#"Debug="true"Service="WcfEmployee.EmployeeSrv"%>
    我们把其中的Service属性指定为WcfEmployee命名空间下的EmployeeSrv类,并把CodeBehind属性删去了。

    第五步:配置此WCF服务站点与WCF服务库项目之间的类的对应。
    虽然在第三步中我们添加了对Services项目的引用,并且在第四步中修改了Service.svc的类的对应,但此时我们的WCF服务站点并不能把WCF服务库中的服务和终结点发布出来,还需要我们对web.config进行一系列的配置工作。
    web.config上右击选择编辑WCF配置

     



    在弹出的服务配置编辑器窗口中,单击新建服务...”

     

     

    单击”浏览”.定位到本项目下的Bin目录,单击WcfEmployee.dll,再选打开.

     

    选”WcfEmployee.EmployeeSrv”,单击”打开”

     

     

     

     

     

     

     


     

     


     


     


    Service.svc上右击,选择在浏览器中查看,在IE中运行此服务。



    由此我们看到我们可以在ASP.NET Development Server中发布我们的WCF服务了。

    第八步:在IIS布署此WCF服务站点。
    打开iis管理器,在其中找到一个正常的网站,如下图中的wa3,右击之,

     

    别名任意,物理路径必须准确为项目所在的目录.

    使浏览器指向”http://localhost:83/EmployeeService/service.svc”,注意”EmployeeService”为刚才指定的别名.

     

    在外网其他电脑上使浏览器指向”http://221.213.51.74:83/EmployeeService/service.svc

    也应该出现上图.

     

     

     

    ()   创建WCF服务宿主程序

    1.    控制台应用程序作为宿主程序


     

    建立控制台应用程序ConsSrvHostEmployee

     

     


    《图1
    ConsSrvHostEmployee程序中添加两个引用:一个是WCF服务库Services项目的引用,另一个是System.ServiceModel引用。

    生成该项目。

     


    ConsSrvHostEmployee 项目中的Program.cs中编写代码。
     

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    using WcfEmployee;

    using System.ServiceModel;

     

    namespace ConsSrvHostEmployee

    {

        class Program

        {

            static void Main(string[] args)

            {

                ServiceHost host = new ServiceHost(typeof(EmployeeSrv));

                host.Credentials.ServiceCertificate.SetCertificate("CN=OujianpingServer");

                host.Open();

                Console.WriteLine("服务已启动......");

                Console.ReadLine();

                host.Close();

            }

        }

    }

     

     

    配置App.Config

     

    App.Config上右击选择选择编辑WCF配置,弹出服务配置管理窗口

     

     

     

     

     

     

     

     



    第六步:点击右边的新建服务...”弹出新建服务元素向导窗口,单击浏览按钮,选择Bin/Debug目录下Services.dll程序集中的Services.EmployeeSrv服务。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    注意进行绑定配置,选择“NewBinding0 netTcpBinding”。

     

     

     

     

     

     

     

     

    配置元数据终结点:

    //如果没有这个过程,也可以正常启动服务,但客户端无法通过引用添加服务引用”.

     

     

     

     

     

     


    System.ServiceModel

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    <?xml version="1.0" encoding="utf-8" ?>

    <configuration>

    <startup>

    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />

    </startup>

    <system.serviceModel>

    <services>

    <service behaviorConfiguration="NewBehavior0" name="WcfEmployee.EmployeeSrv">

    <clear />

    <endpoint address="basic" binding="basicHttpBinding" contract="WcfEmployee.IEmployeeSrv"

                        listenUriMode="Explicit">

    <identity>

    <certificateReference storeName="My" storeLocation="LocalMachine"

                                x509FindType="FindBySubjectName" findValue="OujianpingServer" />

    </identity>

    </endpoint>

    <endpoint address="net.tcp://localhost:8082/Service" binding="netTcpBinding"

                        bindingConfiguration="NewBinding0" contract="WcfEmployee.IEmployeeSrv"

                        listenUriMode="Explicit">

    <identity>

    <certificateReference storeName="My" storeLocation="LocalMachine"

                                x509FindType="FindBySubjectName" findValue="OujianpingServer" />

    </identity>

    </endpoint>

    <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""

                        contract="IMetadataExchange" />

    <host>

    <baseAddresses>

    <add baseAddress="http://localhost/service" />

    </baseAddresses>

    </host>

    </service>

    </services>

    <behaviors>

    <serviceBehaviors>

    <behavior name="NewBehavior0">

    <serviceMetadata />

    </behavior>

    </serviceBehaviors>

    </behaviors>

    <bindings>

    <netTcpBinding>

    <binding name="NewBinding0">

    <security>

    <transport clientCredentialType="None" />

    </security>

    </binding>

    </netTcpBinding>

    </bindings>

    </system.serviceModel>

    </configuration>

     

    注:今后可将以上文件当作一个模版来使用,比如新建了个了名为wcflibwcf服务库项目,在此项目中建立了一个名为wcfserver的服务,并使用名为myCert的证书,则可将文中的WcfEmployee替换为wcflibEmployeeSrv替换为wcfserverOujianpingServer替换为myCert即可,而不必进行上述繁琐的操作。

     

     

     

    用以下命令创建证书

    makecert.exe -sr LocalMachine -ss My -a sha1 -n CN=OuJianpingServer -sky exchange -pe

    (注:复制上述命令时须先整行显示,且只能不能复制行尾的多余空格,否则无法执行.

    如下图

     

    安装的证书可在控制台(cmd mmc)的本地计算机证书下看到

    (文件-添加/删除管理单位-证书-计算机帐户-本地计算机)

     

     

     

     

     

     

     

     

     

     

     


    测试一下。
    选按Ctrl+F5运行打开浏览器,

     

     

     

     

     

     

     

     

     

     

    2.    Windows服务作为宿主程序

    建立Windows服务程序WinSrvEmployee

    注意:必须选.Net Framework 4.5,与WCF服务库项目保持一致,否则引入WCF服务库会出现问题。
     


    《图2

    第二步:WinSrvEmployee程序中添加两个引用:一个是WCF服务库Services项目的引用,另一个是System.ServiceModel引用。

     

    第三步:修改Service1的属性
    Service1的设计界面中右击,选择属性,把其中的(Name)ServiceName都改为EmployeeSrv

     


    《图3

    第四步:在Service1中编写代码如下

     

     

     


    《图4

    ConsSrvHostEmployeev项目中的App.Config复制过来.为防止元数据泄漏,应将其中以下内容删除:

     

    <endpointaddress="mex"binding="mexHttpBinding"bindingConfiguration=""

    contract="IMetadataExchange" />

     


     

    到这里我们已经作好一个可以发布EmployeeSrv服务的Windows Service宿主程序了。
    下面我们要看一看如何把这个Windows Service运行起来。

    第六步:为服务添加安装程序。
    Service1设计界面中右击,选择添加安装程序


    《图6
    生成安装程序组件,出现界面如下


    《图7
    serviceProcessInstaller1:服务安装的信息

     


    《图8
    serviceInstaller1:服务本身的信息


    《图9
    生成项目

    安装的服务

    在计算机中搜索installutil.exe文件,找到版本最高的那个,将其路径写入环量变量path中。
    打开VS2008命令窗口,进入当前项目的bin/Debug文件夹中,执行命令 installutil WinSrvEmployee.exe

    (注:卸载时 InstallUtil.exe /u WinSrvEmployee.exe。)

    启动EmployeeSrv服务
    打开服务管理器,我们可以看到我们刚刚注册上的服务已经存在了,但还没有启动,右击启动


    注意:上述通过windows server项目发布在.net 3.5 vs 2008windows server 2003的环境下无法通过,表现为启动服务会出错,会出现以下提示

    ,原因不明,但可以通过构建winform项目来代替,尤其是托盘型的winform应用。

     

     

    二、 部署WCF服务器

     

     

     

    三、 客户端程序开发

    (一)  创建WCF客户端程序

    (此步vs2008不必做)

     


    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    using System.Windows.Forms;

    using System.ServiceModel;

    using System.ServiceModel.Description;

     

     

    namespace EmployeeIMS

    {

    publicpartialclassForm1 : Form

        {

            ServiceReference1.EmployeeSrvClient mClient = new ServiceReference1.EmployeeSrvClient("NetTcpBinding_IEmployeeSrv");

    public Form1()

            {

                InitializeComponent();

            }

     

    privatevoid Form1_Load(object sender, EventArgs e)

            {

                mClient.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None;

                ServiceReference1.Employee employee = new ServiceReference1.Employee();

                employee.EmployeeName = "王芳";

                employee.EmployeeAge = 18;

                mClient.AddEmployees(employee);

                employee.EmployeeName = "李明";

                employee.EmployeeAge = 17;

                mClient.AddEmployees(employee);

     

    string msg = "";

    foreach(ServiceReference1.Employee em in mClient.GetAllEmployees())

                {

                    msg += em.EmployeeName + "" + em.EmployeeAge + "\r";

                }

    MessageBox.Show(msg);

     

            }

        }

    }

     

     

    (二)  修改app.config

    Localhost

    将app.config文件中的localhost替换为WCF服务器的实际ip地址,否则在其他计算机上运行时无法连接到服务器。

    SendTimeout

    如果客户端的请求需要服务花较长的时间才能回复,且这个过程会超过1分钟,则需要改变使用了进行数据传输的绑定(如netTcpBinding)的SendTimeout的值,并应该留有余量,否则超过1分钟后,客户端将抛出超时的错误。

    maxBufferPoolSize和maxBufferSize

    如果传输的数据过大,则需要改变使用了进行数据传输的绑定(如netTcpBinding)的maxBufferPoolSize和maxBufferSize的值,否则,客户端会抛出错误。

     

     

    展开全文
    jhycjhyc 2019-02-14 17:40:00
  • 什么是WCF Windows Communication Foundation是MS为构建面向服务的应用提供的分布式通信编程框架,是.net framework的重要组成部分,集成了多项微软的分布式技术 什么是Ajax Asynchronous JavaScrip...

    本文是基于Frank Xu的一个webcast上的串并总结,图片等都截至视频,谨致谢.

    路线图

    http://images.cnblogs.com/cnblogs_com/SLKnate/504861/o_3.png

     

    什么是WCF

    Windows Communication Foundation是MS为构建面向服务的应用提供的分布式通信编程框架,是.net framework的重要组成部分,集成了多项微软的分布式技术

    http://images.cnblogs.com/cnblogs_com/SLKnate/504861/o_1.png

     

    什么是Ajax

    Asynchronous JavaScript and XML,即异步JavaScript和XML,基于JavaScript和HTTP请求,其本质原理就是利用XMLHttpRequest对象来直接与服务器进行通信

    http://images.cnblogs.com/cnblogs_com/SLKnate/504861/o_2.png

    将以下内容复制进一个文本编辑器,然后保存在你的一个web容器中,并在同级目录下新建一个data.txt的文件,然后运行,就进行了一次Ajax调用的操作了。see, it easy, right?

    <!DOCTYPE html>
    <html>
    <head>
        <title>纯AJAX例子:读取数据</title>
    </head>
    <body>
        <script type="text/javascript">
        function ajaxCall()
         {
            var xmlHttp;         
            try{// Firefox, Opera 8.0+, Safari
                xmlHttp=new XMLHttpRequest();//实例化XMLHttpRequest对象
            }catch (e){
              // Internet Explorer 5+
                try{
                      xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
                }catch (e){
                    try{
                        xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
                    }catch (e){
                         alert("浏览器不支持AJAX!");
                         return false;
                    }
                }
            }
            
            //绑定数据处理函数。
            xmlHttp.onreadystatechange=function(){
                if(xmlHttp.readyState==4){
                    if (xmlHttp.status == 200){
                        document.getElementById('txtResult').innerHTML = document.getElementById('txtUsername').value + xmlHttp.responseText;
                    } else {
                        alert('请求出错.');
                        // there was a problem with the request,
                        // for example the response may be a 404 (Not Found)
                        // or 500 (Internal Server Error) response codes
                    }                 
                }
            }
            xmlHttp.open("GET","data.txt",true);//异步请求数据
            xmlHttp.send(null);
        }
        </script>
    
        <form style="text-align:left">
            姓名: <input type="text" id="txtUsername"  style="width:400px;" />
            <br />
            测试:<input type="button" id="btn"   value="测试" onclick="ajaxCall();" style="width:400px;" />
            <br />
            结果: <textarea id="txtResult" style="width:400px;"></textarea>
        </form>
    </body>
    </html>
    PureAjaxSample

     

    什么是ASP.NET AJAX

    是微软专为asp.net应用程序所开发的ajax框架,研发代号为Atlas,由Microsoft Ajax Library和asp.net服务器控件两块组成,其本质原理就是让Sys.Net.WebRequestExecutor执行Web请求,封装了XMLHttpRequest对象。

    http://images.cnblogs.com/cnblogs_com/SLKnate/504861/o_4.png

     为了实现Asp.net Ajax, ScriptManager是必须的服务器控件之一,然后服务也必须加上ScriptService标签。这是一大不友好处。但是用vs2008的模板是很容易也很快就可以做完成的一件事情:新建一个web site,然后选择已安装的模板里的Asp.net Web Service就可以创建一个基于web service的asp.net site了。但是2010以后,这一模板却默认被移除了,所以需要先创建一个web site,然后新加item,找到Web serice添加进来即可。

    <!DOCTYPE html>
    <html>
    <head runat="server">
        <title>Ajax 调用Web服务,Call Web Services with ASP.NET AJAX</title>
        <script type="text/javascript">
            function aspnetAjaxSearch() {
                var name = $get("UserName").value;
                AjaxWebService.SayHelloWorld(name,AjaxCallBack);
            }
    
            function AjaxCallBack(result) {
                $get("AjaxResult").value = result.toString();
            }
        </script>
    </head>
    <body>
        <form runat="server">
            <asp:ScriptManager ID="ScriptManager" runat="server">
                <Services>
                    <asp:ServiceReference Path="~/AjaxWebService.asmx" />
                </Services>
            </asp:ScriptManager>
            <p>
                输入姓名
            </p>
            <fieldset>
                <label>
                    姓名<input type="text" id="UserName" /></label>
                <button onclick="aspnetAjaxSearch();">
                    Search
                </button>
    
            </fieldset>
            <fieldset>
                <label>
                    结果<input type="text" id="AjaxResult" /></label>
            </fieldset>
        </form>
    </body>
    </html>
    asp.netajaxSample_default
    using System;
    using System.Collections;
    using System.Linq;
    using System.Web;
    using System.Web.Services;
    using System.Web.Services.Protocols;
    using System.Xml.Linq;
    using System.Web.Script.Services;
    
    /// <summary>
    /// Summary description for AjaxWebService,This demo is finished by Frank Xu Lei.
    /// It is a demo for Asp.NET Ajax Call WebService
    /// </summary>
    [WebService(Namespace = "http://abc.com/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    //Web Service可以被 ASP.NET AJAX客户端调用
    [ScriptService]
    public class AjaxWebService : System.Web.Services.WebService
    {
    
        public AjaxWebService ()
        {
        }
    
        [WebMethod, ScriptMethod]
        //WebMethod,设置此方法可以被Web客户端调用
        //指定调用方法的http动词,以及返回值数据格式
        public string SayHelloWorld(string name) 
        {
            return string.Format("Ajax Hello {0}",name);
        }
        
    }
    asp.netajaxSample_AjaxWebService

     这是基于asmx的,里面的内容就一行:

    <%@ WebService Language="C#" CodeBehind="~/App_Code/AjaxWebService.cs" Class="AjaxWebService" %>

    基于svc的就是WCF服务了。对于wcf,一定需要在web.config里面配置<system.serviceModel>节点,宣告BBS(behaviors,bindings,services),一经宣告,其实上面提到的purce ajax也好,asp.net ajax也好,都是可以调用wcf服务的。但是为什么WCF反而还多出这么些步骤了,这是因为WCF web编程模型必须要解决以下几个问题:一个是HTTP Verb,一个是URI处理和数据格式,所以一般一个WCF 操作就形如以下这样:

    using System;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.ServiceModel.Activation;
    using System.ServiceModel.Web;
    
    
        [ServiceContract(Namespace="abc")]
        [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
        public class AjaxWCFService
        {
            // Add [WebGet] attribute to use HTTP GET
            [OperationContract]
            public String SayHello(String name)
            {
                return String.Format("Ajax, Hello {0}", name);
            }
    
            // Add more operations here and mark them with [OperationContract]
        }
    wcf_service

     

    什么是Web Service

    他不是技术,他是一套技术规范、标准的集合,就是我们常说的Web服务。同样他不是asp.net web service,后者是由微软开发的一个支持web服务规范的一个框架,其内嵌至asp.net中。我们看一下下面的图应该可以理解web service了。

    http://images.cnblogs.com/cnblogs_com/SLKnate/504861/o_5.png

     

    什么是REST

    Representational State Transfer,是一种架构,而不是一个规范。是一种典型的client-server架构,REST=3老的Web规范+3新的规范,3老是指客户-服务器,无状态性,缓存。3新指统一接口,分层系统,按需代码。

     

    什么是RESTful Web服务

    也称RESTful Web API,是使用HTTP Verb和REST设计原则的Web服务,那么什么是REST的设计原则呢,有人总结为四大原则:

    原则一: 使用HTTP的方法进行资源访问
    
     
    
    1) 使用HTTP POST方法去创建 资源
    
    2) 使用HTTP GET方法去读取 资源
    
    3) 使用HTTP PUT 方法去更新 资源
    
    4) 使用HTTP DELETE方法去删除 资源
    
     
    
    原则二: 使用无状态/无会话的服务设计
    
     
    
    很长时间以来,人们采用有状态的服务设计从而在客户端与服务端的多次交互中维护一定的上下文。表格分页应用就是最常见的一个例子,通常程序员在HTTP Session中保持当前页的变量currentPage,当用户用地址http://www.foo.com/articles?action=nextPage来获取下一页的时候,服务可以根据currentPage获取下一页的数据,即返回第currentPage+1页的数据。
    
     
    
    然而,有状态的设计使得程序很难随着工作负载的增加而进行伸缩。比如某个服务实例拥有10000个会话的状态,则通常很难通过增加服务实例来分担其工作负载:工作负载被锁定了! 反之,如果程序被设计成一个无状态的,则可以自由增加服务实例,并且在这些实例之间平衡负载,从而使得服务具有较好的伸缩性,这在大规模分布式系统中尤其重要!!
    
    
    
    原则三: 用目录结构风格的URL设计来表示资源
    
     
    
    用清晰的URL路径表示资源可以使客户端更容易理解和操作资源。URL可以被看作是一种自我解释的接口,不需要太多解释就可以让人明白该URL指向的是什么资源以及如何获得相关的资源。
    
     
    
    下面是几个例子,供大家参考:
    
    http://www.foo.com/research/articles/{article_title}
    
    http://www.foo.com/research/articles/{year}/{month}/{day}/{article_title}
    
     
    
    原则四: 使用XML或JSON来传输数据
    
     
    
    服务和请求的消息数据中包含了对于资源的属性的描述,服务应该采取结构良好并且易于阅读的方式来描述资源。资源可能是数据库中的某个记录集合或者是一个具体的记录,可以是文档,甚至可以是数据中心的服务器。XML、JSON都是结构良好的语言,并且适于阅读。我个人比较偏好使用JSON,更加简洁。下面是两个XML和JSON消息的例子,供大家参考。
    
     
    
    JSON Example:
    
    {
    
        "menu": {
    
               "id": "file",
    
               "value": "File",
    
                "popup": {
    
                       "menuitem": [
    
                                  {"value": "New", "onclick": "CreateNewDoc()"},
    
                                  {"value": "Open", "onclick": "OpenDoc()"},
    
                                  {"value": "Close", "onclick": "CloseDoc()"}
    
                        ]
    
                 }
    
        }
    
    }
    
    
    
    相应的XML:
    
    
    
    <menu id="file" value="File">
    
        <popup>
    
               <menuitem value="New" οnclick="CreateNewDoc()" />
    
               <menuitem value="Open" οnclick="OpenDoc()" />
    
               <menuitem value="Close" οnclick="CloseDoc()" />
    
       </popup>
    
    </menu>
    
     
    REST_Design_Principle

     

    创建支持Ajax的WCF应该怎么做

    <system.serviceModel>       
     <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />    </system.serviceModel>
    web.config中打开asp.net兼容模式

    详细原因可以查看msdn的说法.

     

    什么是安全,WCF的安全解决方案

     三方面来看,一是保证服务端安全,二是保证客户端安全和保证数据安全。服务端安全就是指客户端有效,免于攻击。 客户端安全就是指证服务端有效,不会欺骗。数据安全指数据的安全,完整,有效。

    http://images.cnblogs.com/cnblogs_com/SLKnate/504861/o_6.png

     

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.web>
        <compilation debug="true" />
      </system.web>
      <!-- When deploying the service library project, the content of the config file must be added to the host's 
      app.config file. System.Configuration does not support config files for libraries. -->
      <system.serviceModel>
        <services>
          <service behaviorConfiguration="WCFService.WCFServiceBehavior"
            name="WCFService.WCFService">
            <endpoint 
              address="WCFService" 
              binding="wsHttpBinding"  bindingConfiguration="MessageAndUserName" contract="WCFService.IWCFService">
            </endpoint>
            
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8001/"/>
              </baseAddresses>
            </host>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="WCFService.WCFServiceBehavior">
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="false" />
              <serviceCredentials>
                <serviceCertificate  x509FindType="FindBySubjectName" findValue="WCFServerPK" storeLocation="LocalMachine"/>
                <clientCertificate >
                  <authentication certificateValidationMode="None" />
                </clientCertificate>
                <userNameAuthentication userNamePasswordValidationMode="Custom"    customUserNamePasswordValidatorType="WCFService.MyUserNamePasswordValidator,WCFService" />
              </serviceCredentials>
            </behavior>
           
          </serviceBehaviors>
        </behaviors>
        <bindings>
          <wsHttpBinding>
            <binding  name="MessageAndUserName"   >
              <security  mode="Message">
                <transport clientCredentialType="None"/>
                <message clientCredentialType="UserName"/>
              </security>
            </binding>
          </wsHttpBinding>
        </bindings>
         </system.serviceModel> 
    </configuration>
    服务端app.config BBS示例
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <system.serviceModel>
          <bindings>
            <wsHttpBinding>
              <binding name="WSHttpBinding_IWCFService" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
                textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                  maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00"
                  enabled="false" />
                <security mode="Message">
                  <transport clientCredentialType="Windows" proxyCredentialType="None"
                    realm="">
                    <extendedProtectionPolicy policyEnforcement="Never" />
                  </transport>
                  <message clientCredentialType="UserName" negotiateServiceCredential="true"
                    algorithmSuite="Default" establishSecurityContext="true" />
                </security>
              </binding>
            </wsHttpBinding>
          </bindings>
          <client>
            <endpoint address="http://localhost:8001/WCFService" binding="wsHttpBinding"
              bindingConfiguration="WSHttpBinding_IWCFService" contract="ClientProxy.IWCFService"
              name="WSHttpBinding_IWCFService">
              <identity>
                <certificate encodedValue="AwAAAAEAAAAUAAAAaHVNCjRUhKcLhdiQj6OKqoQuua8gAAAAAQAAAPgBAAAwggH0MIIBYaADAgECAhBxCLtwjs80j01ASx27FgBgMAkGBSsOAwIdBQAwFjEUMBIGA1UEAxMLV0NGU2VydmVyUEswHhcNMTAxMDE2MDQyNTMyWhcNMzkxMjMxMjM1OTU5WjAWMRQwEgYDVQQDEwtXQ0ZTZXJ2ZXJQSzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAyKwsLLhGG1PlU4jm6Kpa045GH7ZOWX1UaPNLezMkUpDNnoBeeGXrN1Rs/14t+eDP272camnbU+2NQl8ejkIdYxdZ38Dz7FnOMbBxkJqLRz1DPBKIrb0Qkyfip72I+XGcRZG+dyNA779pnNMlAtkAAFAT8eJd2aosoO4OizOs+cECAwEAAaNLMEkwRwYDVR0BBEAwPoAQqY66whxaxoF8zts5rjLnEqEYMBYxFDASBgNVBAMTC1dDRlNlcnZlclBLghBxCLtwjs80j01ASx27FgBgMAkGBSsOAwIdBQADgYEAd/TDzhMnDxOYf2aeWZtGPTZxSN56+uNPCMZRG1eH6MTMGlt6yuiKR1xfHpttsZfjk80vxrKOVuyezaljyJ8zN9wb5hjF2j7OO0DUlG+hpNT3exDGN+/VAbxn2MSwZEyDziTCiz77P+StXoML+b1qMAWZHNM1gjCxbd7T+hbZGPM=" />
              </identity>
            </endpoint>
          </client>
          <behaviors>
              <endpointBehaviors>
                <behavior name="clientBehavior">
                  <clientCredentials>
                    <serviceCertificate>
                      <authentication certificateValidationMode="None" />
                    </serviceCertificate>
                  </clientCredentials>
                </behavior>
              </endpointBehaviors>
          </behaviors>
           
        </system.serviceModel>
    </configuration>
    客户端app.config BBC示例

    这里有个WCF配置文件的注释版本

    <?xml version="1.0" encoding="utf-8" ?>
    
    <configuration>
    
         <system.ServiceModel>
    
             <!-- services 元素包含应用中驻留的所有service的配置要求 -->
    
             <services>
    
                  <!-- 每个服务的配置
    
                 属性说明:
    
                 name - 指定这个service配置是针对的那个服务,为一个实现了某些Contract的服务类的完全限定名
    
                       (名称空间.类型名),ServiceHost载入一个服务后,会到配置文件中的<services>下找有没有
    
                       name属性跟服务匹配的<service>的配置
    
                 behaviorConfiguration - 指定在<serviceBehaviors>下的一个<behavior>的name,这个特定<behavior>
    
                                         给这个service制定了一些行为,比如服务是否允许身份模拟-->
    
                  <service name="名称空间.类型名" behaviorConfiguration="behavior名">
    
                       <host>
    
                           <baseAddresses>
    
                                <!-- 在此可以定义每种传输协议的baseAddress,用于跟使用同样传输协议Endpoint定义的相对地
    
                        址组成完整的地址,但是每种传输协议只能定义一个baseAddress。HTTP的baseAddress同时是service
    
                        对外发布服务说明页面的URL-->
    
                                <add baseAddress="http://address" />
    
                           </baseAddresses>
    
                           <timeouts></timeouts>
    
                       </host>
    
                       <!-- 每个服务可以有多个Endpoint,下面<endpoint>元素对每个Endpoint分别进行配置
    
                     属性说明:
    
                     address - 指定这个Endpoint对外的URI,这个URI可以是个绝对地址,也可以是个相对于baseAddress的
    
                               相对地址。如果此属性为空,则这个Endpoint的地址就是baseAddress
    
                     binding - 指定这个Endpoint使用的binding,这个banding可以是系统预定义的9个binding之一,
    
                               比如是basicHttpBinding,也可以是自定义的customBinding。binding决定了通讯的类型、
    
                               安全、如何编码、是否基于session、是否基于事务等等
    
                     contract - 指定这个Endpoint对应的Contract的全限定名(名称空间.类型名),这个Contract应该被
    
                                service元素的name指定的那个service实现
    
                     bindingConfiguration - 指定一个binding的配置名称,跟<bindings>下面同类<binding>的name匹配
    
                        behaviorConfiguration - 指定这个endpoint的behavior,指向<behaviors>下的同样配置名称的<endpointBehaviors>
    
                     name - Endpoint的名称,可选属性,每个Contract都可以有多个Endpoint,但是每个Contract对应的
    
                            多个Endpoint名必须是唯一的-->
    
                       <endpoint address="URI" binding="basicHttpBinding" contract="Contract全限定名" bindingConfiguration="binding名" behaviorConfiguration="String" name="">
    
                           <!-- 用户定义的xml元素集合,一般用作SOAP的header内容-->
    
                           <headers>
    
                                <!-- 任何xml内容 -->
    
                           </headers>
    
                       </endpoint>
    
                  </service>
    
             </services>
    
     
    
             <bindings>
    
                  <!-- 指定一个或多个系统预定义的binding,比如<basicHttpBinding>,当然也可以指定自定义的customBinding,
    
                 然后在某个指定的binding下建立一个或多个配置,以便被Endpoint来使用这些配置 -->
    
                  <basicHttpBinding>
    
                       <!-- 某一类的binding的下面可能有多个配置,binding元素的name属性标识某个binding-->
    
                       <binding name="binding名">
    
                       </binding>
    
                  </basicHttpBinding>
    
             </bindings>
    
             <!-- 定义service和Endpiont行为-->
    
             <behaviors>
    
                  <!-- 定义service的行为-->
    
                  <serviceBehaviors>
    
                       <!-- 一个或多个系统提供的或定制的behavior元素
    
                     属性说明:
    
                     name - 一个behavior唯一标识,<service>元素下<endpoint>的behaviorConfiguration属性指向这个name-->
    
                       <behavior name="此Behavior名称">
    
                           <!-- 指定service元数据发布和相关信息
    
                         属性说明:
    
                         httpGetEnabled - bool类型的值,表示是否允许通过HTTP的get方法获取sevice的WSDL元数据
    
                         httpGetUrl - 如果httpGetEnabled为true,这个属性指示使用哪个URL地址发布服务的WSDL,
    
                                      如果这个属性没有设置,则使用服务的HTTP类型的baseAddress后面加上?WSDL-->
    
                           <serviceMetadata httpGetEnabled="true" httpGetUrl="http://URI:port/address" />
    
                           <!--指定验证服务端的凭据-->
    
                           <serviceCredentials>
    
                                <!--指定服务端的证书
    
                             属性说明:
    
                             storeName - 证书的存储区,可能值为:AddressBook,AuthRoot,CertificateAuthority
    
                                         Disallowed,My,Root,TrustedPeople,TrustedPublisher
    
                             storeLocation - 证书存储位置,可能值为:CurrentUser,LocalMachine
    
                                 x509FindType - 查找证书的方式,可能的值:FindBySubjectName,FindByThumbPrint,FindByIssuerName......
    
                                 findValue - 对应查找方式的要查找证书的值                  -->
    
                                <serviceCertificate storeName="存储区" storeLocation="存储位置" x509FindType="FindBySubjectName" findValue="server1" />
    
                           </serviceCredentials>
    
     
    
                       </behavior>
    
                  </serviceBehaviors>
    
                  <!-- 定义Endpiont的行为-->
    
                  <endpointBehaviors>
    
                       <!-- 一个或多个系统提供的或定制的behavior元素
    
                     属性说明:
    
                     name - 一个behavior唯一标识,<client>元素下<endpoint>的behaviorConfiguration属性指向这个name-->
    
                       <behavior name="此Behavior名称">
    
                           <!--指定客户端的凭据-->
    
                           <clientCredentials>
    
                                <!--指定客户端的证书
    
                             属性说明:
    
                             storeName - 证书的存储区,可能值为:AddressBook,AuthRoot,CertificateAuthority
    
                                         Disallowed,My,Root,TrustedPeople,TrustedPublisher
    
                             storeLocation - 证书存储位置,可能值为:CurrentUser,LocalMachine
    
                                 x509FindType - 查找证书的方式,可能的值:FindBySubjectName,FindByThumbPrint,FindByIssuerName......
    
                                 findValue - 对应查找方式的要查找证书的值                  -->
    
                                <clientCertificate storeName="存储区" storeLocation="存储位置" x509FindType="FindBySubjectName" findValue="Client1" />
    
                                <serviceCertificate>
    
                                     <authentication certificateValidationMode="None" />
    
                                </serviceCertificate>
    
                           </clientCredentials>
    
                       </behavior>
    
                  </endpointBehaviors>
    
             </behaviors>
    
             <!-- 包含客户端跟服务端连接使用到的Endpoint的配置 -->
    
             <client>
    
                  <!-- 每个客户端Endpoint设置
    
                 属性说明:
    
                 address - 对应到服务端这个Endpoint的address
    
                 binding - 指定这个Endpoint使用的binding,这个banding可以是系统预定义的9个binding之一,
    
                           比如是basicHttpBinding
    
                 contract - 指定这个Endpoint对应的Contract的全限定名(名称空间.类型名)
    
                 name - Endpoint的配置名,客户端代理类的构造方法中的endpointConfigurationName对应到这个name
    
                 bindingConfiguration - 指定客户端binding的具体设置,指向<bindings>元素下同类型binding的name
    
                   behaviorConfiguration - 指定这个endpoint的behavior,指向<behaviors>下的同样配置名称的<endpointBehaviors>-->
    
                  <endpoint address="URI" binding="basicHttpBinding" bindingConfiguration="binding名" behaviorConfiguration="String" contract="Contract全限定名" name="endpoint配置名" >
    
                       <!-- 用于客户端验证服务端身份,可选以下一种方式验证服务端-->
    
                       <identity>
    
                           <userPrincipalName></userPrincipalName>
    
                           <servicePrincipalName></servicePrincipalName>
    
                           <!--如果客户端验证是windows,这里指定DNS名;如果是Certificate,这里指定证书subject name-->
    
                           <dns></dns>
    
                           <rsa></rsa>
    
                           <!--指定服务端证书的公钥
    
                                属性说明:
    
                                encodedValue - 服务端证书的公钥的base64编码,用于加密用户名和密码-->
    
                           <certificate encodedValue=""></certificate>
    
                           <!-- 用户指定在客户端证书存储区内的服务端证书
    
                             属性说明:
    
                             storeName - 证书的存储区,可能值为:AddressBook,AuthRoot,CertificateAuthority
    
                                         Disallowed,My,Root,TrustedPeople,TrustedPublisher
    
                             storeLocation - 证书存储位置,可能值为:CurrentUser,LocalMachine
    
                                 x509FindType - 查找证书的方式,可能的值:FindBySubjectName,FindByThumbPrint,FindByIssuerName......
    
                                 findValue - 对应查找方式的要查找证书的值                  -->
    
                           <certificateReference storeName="存储区" storeLocation="存储位置" x509FindType="FindBySubjectName" findValue="Client1" />
    
                       </identity>
    
                  </endpoint>
    
             </client>
    
         </system.ServiceModel>
    
    </configuration>
    WCF配置文件注释

     

     

     

     

    转载于:https://www.cnblogs.com/SLKnate/p/WCF_AJAX_Best_Practice.html

    展开全文
    awihqwyo11127 2019-10-08 16:54:31
  • 18KB caominghui1221 2011-03-22 20:37:39
  • 第1章 SharePoint Foundation开发基础1 1.1 SharePoint能做什么1 1.2 SharePoint Foundation和SharePoint Server 2010的区别2 1.3 SharePoint Foundation新特性4 1.4 SharePoint 2010基础概念4 1.4.1 服务器场5 ...

    目 录
    第1章 SharePoint Foundation开发基础1
    1.1 SharePoint能做什么1
    1.2 SharePoint Foundation和SharePoint Server 2010的区别2
    1.3 SharePoint Foundation新特性4
    1.4 SharePoint 2010基础概念4
    1.4.1 服务器场5
    1.4.2 Web应用程序6
    1.4.3 服务应用程序8
    1.4.4 网站集和网站9
    1.4.5 字段类型、网站栏和内容类型10
    1.4.6 列表和文档库14
    1.5 SharePoint Foundation的服务器端对象模型17
    1.5.1 概述17
    1.5.2 创建一个HelloWorld控制台程序18
    1.5.3 站点集和站点20
    1.5.4 列表和文档库21
    1.5.5 列表项和文件22
    1.5.6 开发人员面板24
    1.6 SharePoint解决方案开发25
    1.6.1 什么是SharePoint解决方案25
    1.6.2 了解SharePoint系统根目录结构26
    1.6.3 手动创建Feature27
    1.6.4 手动创建解决方案包30
    1.7 SharePoint浏览器32
    1.8 SharePoint Designer 201033
    本章小结34
    第2章 SharePoint Windows PowerShell指南35
    2.1 快速了解Windows PowerShell35
    2.2 书写Windows PowerShell脚本37
    2.3 使用Windows PowerShell集成脚本开发环境(ISE)39
    2.4 SharePoint Windows PowerShell插件41
    启用SharePoint PowerShell插件41
    2.5 使用Windows PowerShell管理SharePoint44
    2.5.1 使用PowerShell创建Web应用程序44
    2.5.2 使用PowerShell创建网站集45
    本章小结46
    第3章 SharePoint列表新特性以及数据访问47
    3.1 使用CAML查询列表47
    3.1.1 概述47
    3.1.2 CAML语法介绍48
    3.1.3 关联列表查询52
    3.1.4 多列表查询54
    3.1.5 Throttling查询57
    3.2 使用LINQ操作列表60
    3.2.1 LINQ语法概述61
    3.2.2 在SharePoint中使用LINQ64
    3.3 OpenXML72
    本章小结72
    第4章 SharePoint UI定制73
    4.1 SharePoint与ASP.NET74
    4.1.1 概述74
    4.1.2 在SharePoint里使用到的ASP.NET技术76
    4.1.3 SharePoint Web配置文件76
    4.2 SharePoint Foundation的页面提供机制80
    4.2.1 SharePoint Foundation页面提供机理:Ghost页面80
    4.2.2 通过SharePoint对象模型操作站点页面82
    4.2.3 通过SharePoint Designer定制表单页面84
    4.3 应用程序页面详解与开发87
    4.4 母版详解与开发90
    4.5 导航栏与BreadCrumb定制100
    4.5.1 通过Web浏览器定制导航栏100
    4.5.2 通过SharePoint Designer定制导航栏101
    4.5.3 通过Visual Studio开发定制导航栏103
    4.5.4 BreadCrumb定制106
    4.6 Ribbon与Dialog Framework定制110
    4.6.1 Ribbon110
    4.6.2 Dialog框架121
    本章小结123
    第5章 SharePoint控件和Web部件124
    5.1 Web部件历史回顾124
    5.2 使用自定义控件125
    5.3 使用用户控件126
    5.4 代理控件开发128
    5.5 Web部件开发133
    5.5.1 ASP.NET的Web部件134
    5.5.2 SharePoint的Web部件支持134
    5.5.3 Web部件开发135
    5.6 可视化Web部件开发144
    5.7 SilverLight Web部件147
    5.8 XSLT List View Web部件150
    本章小结153
    第6章 SharePoint模板和类型定义154
    6.1 自定义字段类型154
    6.1.1 自定义字段构建基础155
    6.1.2 创建自定义字段控件159
    6.1.3 利用模板开发字段控件162
    6.1.4 带定制属性的自定义字段167
    6.2 站点定义178
    6.2.1 站点定义整体结构179
    6.2.2 ONET.xml定义清单181
    6.2.3 Global站点定义185
    6.2.4 创建自定义站点定义187
    6.2.5 Feature Stapling技术189
    本章小结190
    第7章 SharePoint事件处理器191
    7.1 事件处理器概述191
    列表项事件处理器192
    7.2 注册事件处理器197
    7.3 事件处理器高级开发205
    7.4 Feature事件处理器209
    本章小结209
    第8章 SharePoint客户端对象模型210
    8.1 客户端对象模型架构211
    8.1.1 客户端对象模型概念初览212
    8.1.2 增加最大消息大小214
    8.1.3 通过WebDav方式访问SharePoint数据214
    8.2 .NET托管客户端对象模型开发215
    8.2.1 数据过滤216
    8.2.2 创建列表和列表项217
    8.2.3 列表、列表项数据查询及过滤220
    8.2.4 列表、列表项更新和删除222
    8.2.5 操作文件223
    8.2.6 异步数据获取224
    8.3 Silverlight客户端对象模型开发226
    8.4 ECMAScript客户端对象模型开发231
    8.4.1 创建列表233
    8.4.2 获取所有列表235
    8.4.3 列表查询237
    8.4.4 使用JQuery238
    8.5 WCF数据服务240
    本章小结243
    第9章 SharePoint沙盒解决方案244
    9.1 沙盒模型概述244
    9.1.1 创建简单的沙盒解决方案245
    9.1.2 沙盒解决方案架构247
    9.1.3 沙盒解决方案的限制251
    9.2 开发沙盒解决方案254
    9.2.1 开发沙盒Web部件解决方案254
    9.2.2 创建Ribbon256
    9.3 管理沙盒解决方案260
    9.3.1 管理中心260

    9.3.2 验证解决方案262
    本章小结264
    第10章 SharePoint工作流开发265
    10.1 工作流开发概述265
    10.1.1 SharePoint 2010中的工作流种类266
    10.1.2 配置工作流267
    10.1.3 SharePoint工作流的工作方式270
    10.2 使用SharePoint Designer设计工作流275
    10.2.1 产品订单申请审批流程275
    10.2.2 可重复使用的工作流288
    10.2.3 站点工作流289
    10.2.4 Visio和SharePoint工作流转换289
    10.3 自定义工作流组件290
    10.3.1 扩展动作290
    10.3.2 扩展条件298
    10.3.3 工作流模板开发301
    10.3.4 工作流关联表单概述317
    10.3.5 创建工作流模板关联设置表单319
    10.3.6 创建工作流初始化设置表单324
    10.3.7 创建工作流任务编辑表单325
    10.4 SharePoint工作流事件332
    本章小结337
    附录A SharePoint 2010开发经验与注意事项338
    A.1 SPWeb和SPSite对象的使用338
    A.2 文件名限制341
    A.3 大文件夹和大列表的处理341
    A.4 对象缓存342
    A.5 代码优化344

    展开全文
    sinolover 2019-09-20 10:06:21
  • 5星
    41.05MB ycc669669 2012-02-18 18:08:46
  • 是Windows平台上开发分布式应用最佳实践方式。简单的归结为四大部分: 1.网络服务的协议,即用什么网络协议开放客户端接入。 2.业务服务的协议,即声明服务提供哪些业务。 3.数据类型声明,即对客户

    Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有HTTPFTP的相关技术。是Windows平台上开发分布式应用最佳的实践方式。简单的归结为四大部分:

    1.网络服务的协议,即用什么网络协议开放客户端接入

    2.业务服务的协议,即声明服务提供哪些业务

    3.数据类型声明,即对客户端与服务器端通信的数据部分进行一致化

    4.传输安全性相关的定义。

    它是.NET框架的一部分,由 .NET Framework3.0 开始引入,与Windows Presentation Foundation及Windows Workflow Foundation并行为新一代 Windows操作系统以及 WinFX 的三个重大应用程序开发类库。在 .NET Framework2.0 以及前版本中,微软发展了 Web Service(SOAP with HTTP communication),.NET Remoting (TCP/HTTP/Pipeline communication) 以及基础的 Winsock 等通信支持。由于各个通信方法的设计方法不同,而且彼此之间也有相互的重叠性,对于开发人员来说,不同的选择会有不同的程序设计模型,而且必须要重新学习,让开发人员在使用中有许多不便。同时,面向服务架构(Service-Oriented Architecture) 也开始盛行于软件工业中,因此微软重新查看了这些通信方法,并设计了一个统一的程序开发模型,对于数据通信提供了最基本最有弹性的支持,这就是 Windows Communication Foundation。

    概念

    WCF 由于集合了几乎由.NET Framework提供的所有的通信方法,因此学习曲线比较陡峭,开发人员必须要针对各个部分的内涵做深入的了解,才能够操控 WCF 来开发应用程序。

    通信双方的沟通方式,由合约来订定。通信双方所遵循的通信方法,由协议绑定来订定。通信期间的安全性,由双方约定的安全性层次来订定。

    ​​​​​​契约

    WCF 的基本概念是以契约(Contract) 来定义双方沟通的协议,合约必须要以接口的方式来体现,而实际的服务代码必须要由这些合约接口派生并实现。合约分成了四种:

    数据契约(Data Contract),订定双方沟通时的数据格式。服务契约(Service Contract),订定服务的定义。操作契约(Operation Contract),订定服务提供的方法。消息契约(Message Contract),订定在通信期间改写消息内容的规范。一个 WCF 中的契约,就如同下列代码所示:

    using System;
    using System.ServiceModel;
    namespace Microsoft.ServiceModel.Samples{
    [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")] // 服务契约
    public interface ICalculator
    {
    [OperationContract] // 操作契约
    double Add(double n1, double n2);
    [OperationContract] //操作契约
    double Subtract(double n1, double n2);
    [OperationContract] // 操作契约
    double Multiply(double n1, double n2);
    [OperationContract] //操作契约
    double Divide(double n1, double n2);
    }
    }

    协议绑定

    由于 WCF 支持了HTTPTCP,Named Pipe,MSMQ,Peer-To-Peer TCP 等协议,而 HTTP 又分为基本 HTTP 支持 (BasicHttpBinding) 以及 WS-HTTP 支持 (WsHttpBinding),而 TCP 亦支持 NetTcpBinding,NetPeerTcpBinding 等通信方式,因此,双方必须要统一通信的协议,并且也要在编码以及格式上要有所一致

    一个设置通信协议绑定的示例如下:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    <system.serviceModel>
    <!-- 设定服务系统的资讯 -->
    <services>
    <service name=" CalculatorService" >
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding1" contract="ICalculator" /><!--端口配置-->
    </service>
    </services>
    <!-- 设定通讯协定系统的资讯 -->
    <bindings>
    <wsHttpBinding>
    <binding name="Binding1">
    </binding>
    </wsHttpBinding>
    </bindings>
    </system.serviceModel>
    </configuration>

    虽然 WCF 也可以使用SOAP做通信格式,但它和以往的ASP. NETXML Web Services不同,因此有部分技术文章中,会将 ASP. NET 的 XML Web Services 称为ASMX Service

    WCF 的服务可以挂载于 Console Application,Windows Application,IIS (ASP. NET) Application,Windows Service以及Windows Activation Services中,但大多都会挂在 Windows Service

    安全性层次

    WCF 实现上已经支持了传输层次安全性 (Transport-level security) 以及消息层次安全性 (Message-level security) 两种。

    传输层次安全性:在数据传输时期加密,例如 SSL。消息层次安全性:在数据处理时就加密,例如使用数字签名,散列或是使用密钥加密等。

    客户端

    对于 WCF 的客户端来说,WCF 服务就像是一个 Web Service 一样,在 Visual Studio 2008 中,所有 WCF 服务的连接都是由客户端的 服务代理(WCF Service Proxy,服务代理屏蔽通讯细节) 来运行,开发人员不用花费太多心思在通信上,而 WCF Service Proxy 在 Visual Studio 中被称为服务引用(Service Reference)

    在 Visual Studio 中加入 WCF 的服务引用时,Visual Studio 会自动帮开发人员做掉一些必要工作(例如组态创建以及产生 Service Proxy 等),开发人员只需要在代码中取用 WCF Service Proxy 对象即可。

    WCF的优势

    在David Chappell所撰的《Introducing Windows Communication Foundation》一文中,用了一个活鲜鲜的例子,来说明WCF的优势所在。假定我们要为一家汽车租赁公司开发一个新的应用程序,用于租车预约服务。该租车预约服务会被多种应用程序访问,包括呼叫中心(Call Center),基于J2EE的租车预约服务以及合作伙伴的应用程序(Partner Application)

    从功能的角度来看,WCF完全可以看作是ASMX,.Net Remoting,Enterprise Service,WSE,MSMQ等技术的并集。(注:这种说法仅仅是从功能的角度。事实上WCF远非简单的并集这样简单,它是真正面向服务的产品,它已经改变了通常的开发模式。)因此,对于上述汽车预约服务系统的例子,利用WCF,就可以解决包括安全、可信赖、互操作、跨平台通信等等需求。开发者再不用去分别了解.Net Remoting,ASMX等各种技术了。

    概括地说,WCF具有如下的优势:

    1、统一性

    前面已经叙述,WCF是对于ASMX,.Net Remoting,Enterprise Service,WSEMSMQ等技术的整合。由于WCF完全是由托管代码编写,因此开发WCF的应用程序与开发其它的.Net应用程序没有太大的区别,我们仍然可以像创建面向对象的应用程序那样,利用WCF来创建面向服务的应用程序。

    2、互操作性

    由于WCF最基本的通信机制是SOAP(Simple Object Access Protocol 简易对象访问协议),这就保证了系统之间的互操作性,即使是运行不同的上下文中。这种通信可以是基于.Net到.Net间的通信,如下图所示:

    可以跨进程、跨机器甚至于跨平台的通信,只要支持标准的Web Service,例如J2EE应用服务器(如WebSphere,WebLogic)。应用程序可以运行在Windows操作系统下,也可以运行在其他的操作系统,如Sun Solaris,HP Unix,Linux等等。如下图所示:

    3、安全与可信赖

    WS-Security,WS-TrustWS-SecureConversation均被添加到SOAP消息中,以用于用户认证数据完整性验证,数据隐私等多种安全因素。

    在SOAP 的header中增加了WS-ReliableMessaging允许可信赖的端对端通信。而建立在WS-Coordination和WS- AtomicTransaction之上的基于SOAP格式交换的信息,则支持两阶段的事务提交(two-phase commit transactions)。

    上述的多种WS-Policy在WCF中都给与了支持。对于Messaging而言,SOAP是Web Service的基本协议,它包含了消息头(header)和消息体(body)。在消息头中,定义了WS-Addressing用于定位SOAP消息的地址信息,同时还包含了MTOM(消息传输优化机制,Message Transmission Optimization Mechanism)。

    4、兼容性

    WCF充分的考虑到了与旧有系统的兼容性。安装WCF并不会影响原有的技术如ASMX和.Net Remoting。即使对于WCF和ASMX而言,虽然两者都使用了SOAP,但基于WCF开发的应用程序,仍然可以直接与ASMX进行交互。

    WCF程序结构

    1. 契约(Contracts):主要定义了实现那些服务,如何访问服务

    2. 服务(Services):实现契约定义的方法

    3. 宿主程序(Hosting):提供低层传输功能的支持

    4. 客户端(Client):根据契约访问服务

    结构分析

    契约(所谓契约就是接口)

    namespace WcfStudy
    {
        // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IMyFirstSerice”。
        [ServiceContract]
        public interface IMyFirstSerice
        {
            [OperationContract]
            string SayHello(string name);
        }
    }

    服务(所谓服务就是接口实现)

    namespace WcfStudy
    {
        // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“MyFirstSerice”。
        // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 MyFirstSerice.svc 或 MyFirstSerice.svc.cs,然后开始调试。
        public class MyFirstSerice : IMyFirstSerice
        {
            public string  SayHello(string name)
            {
                 return  "Hello "+name;
            }
        }
    }

    宿主程序

    WCF在运行时必寄宿在“宿主程序”之上,WCF本身不能够独自运行(每个WCF服务必须宿主在一个Windows进程中)。

    WCF服务应用程序与WCF服务库的不同

    WCF服务应用程序,是一个可以执行的程序,它有独立的进程,WCF服务类契约的定义,可以直接看到运行的效果。此项目模板基于IIS托管的程序

    WCF服务库,可以认为是一个包含WCF服务以及契约定义的类库。不能直接运行,你可以在其他项目里引用,在宿主里启用托管这个库,有点类似于我们在Web项目中应用的类库。我们需要为此服务库添加一个宿主

    WCF的宿主可以是 Windows 服务、COM+应用程序、WAS(Windows Activation Services,Windows进程激活服务)或IIS、Windows应用程序,或简单的控制台应用程序及任何.net程序。

    如何为wcf添加一个宿主?

    1.使用控制台应用程序作为wcf宿主

    //创建宿主的基地址
                Uri baseAddress = new Uri("http://localhost:8080/User");
                //创建宿主
                using (ServiceHost host = new ServiceHost(typeof(User), baseAddress))
                {
                    //向宿主中添加终结点
                    host.AddServiceEndpoint(typeof(IUser), new WSHttpBinding(), "");
                    //将HttpGetEnabled属性设置为true
                    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                    smb.HttpGetEnabled = true;
                    //将行为添加到Behaviors中
                    host.Description.Behaviors.Add(smb);
                    //打开宿主
                    host.Open();
                    Console.WriteLine("WCF中的HTTP监听已启动....");
                    Console.ReadLine();
                    host.Close();
                }

    为客户端添加wcf服务引用

    image

    public ActionResult GetWcfResult()
            {
                return View();
            }
    
            [HttpPost]
            public ActionResult GetWcfResult(string name)
            {
                //UserClient userClient = new UserClient();
                MyFirstSericeClient myFirstSericeClient = new MyFirstSericeClient();
                string temp = myFirstSericeClient.SayHello(name);
                ViewBag.username = temp;
                return View();
            }

    在mvc客户端中调用wcf服务

    MyFirstSericeClient是在客户端添加服务引用后生成的,其命名规则是为服务名+Client

    基本类似的添加宿主服务和上边差不多,总之wcf一定是要寄宿在宿主程序中去的

    客户端

    这里使用一个简单的mvc例子作为客户端,客户端只需要添加服务引用后即可对wcf服务使用

    WCF非常好的上屏蔽了低层细节(服务器和客户端之间的通信、数据传输等),开发者只需要关注业务逻辑即可,并且非常灵活

    展开全文
    fuhanghang 2020-10-27 14:11:17
  • u013043341 2016-01-24 21:47:05
  • 109.05MB zyx_hawk 2018-01-30 14:51:21
  • caijunjun1006 2013-10-12 13:42:15
  • yiyidsj 2020-02-10 16:04:55
  • weixin_30747253 2019-07-07 02:40:52
  • 1.81MB qq_41248260 2021-03-10 17:34:34
  • weixin_30369087 2012-02-19 13:35:00
  • T_6666 2016-03-17 16:55:26
  • 3.71MB amychime 2014-12-27 22:59:51
  • 2.08MB weixin_39840515 2019-07-16 09:17:52
  • 88KB caominghui1221 2011-03-22 20:39:34
  • diaoshisun9421 2019-10-08 16:15:00
  • 9.54MB fanjianbo 2010-04-27 12:58:49
  • weixin_34242509 2017-11-08 19:55:00
  • 4星
    9.31MB fanjianbo 2010-04-27 13:11:50
  • 5星
    4.83MB fanjianbo 2010-04-27 13:27:21
  • 5星
    9.54MB fanjianbo 2010-04-27 13:21:56
  • 5星
    9.54MB fanjianbo 2010-04-27 13:16:48
  • 5星
    9.54MB fanjianbo 2010-04-27 13:04:28
  • zmh458 2017-12-30 21:37:20

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,913
精华内容 765
关键字:

wcf开发最佳实践