Web Service Demo图解和WCF Demo图解对比

Posted 凌风95

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web Service Demo图解和WCF Demo图解对比相关的知识,希望对你有一定的参考价值。

1.新建一个MVC web项目。

2.点击项目,【右键】→【添加】→【新建项】

3.点击【Web】→【Web服务】

4.恭喜,Web Service已经新建成功,里面的方法就可以参考着根据自己的需要进行修改了,是不是很简单。

5.Web Serice建成之后当然是开始调用了。在【引用】上【右键】,添加【服务引用】

6.开始引用。

7.恭喜服务已经引用成功。

再看配置文件,会多出一些代码,这些都是自动生成的,可以看看理解理解。

 

8.开始在程序中调用方法了

 9.到此为止Web Service的建立到调用已经全部完成。

10.新建WCF与Web Service基本上是一样的,下面直图解不在介绍。

点击项目,【右键】→【添加】→【新建项】→【Web】→【WCF服务】

11.WCF建成之后当然是开始调用了。在【引用】上【右键】,添加【服务引用】,以后过程即使一模一样的了。

 

12.WCF和Web Service已经建立成功,那么如何供外部访问呢,当时是发布了,发布在IIS就可以,和发布网站是一样的。

WCF控制台应用程序例子

上面这是个简单的架构图。Iservice大家都有的功能的接口(契约),IUserService针对不同的类定义不同的接口,

AbstractService实现IService的公共方法,Uservice实现自己的方法,也可以重写集成的方法。

下面是分层,Web层,大家可以当做不存在,哈哈。

下面是IService层

using System;
using System.Collections.Generic;
using System.ServiceModel;

namespace IServiceClassLibrary
{
    [ServiceContract]
    public interface IService<TModel> : IDisposable where TModel : new()
    {
        [OperationContract]
        string Add(TModel tModel);

        [OperationContract]
        string Delete(int id);
        
        [OperationContract]
        string Edit(TModel tModel);

        [OperationContract]
        TModel GetModel(int id);

        [OperationContract]
        IEnumerable<TModel> GetAll();
    }
}
using System;
using System.Runtime.Serialization;

namespace IServiceClassLibrary
{
    [DataContract]
    public class UserData
    {
        [DataMember]
        public int UserID { get; set; }

        [DataMember]
        public string UserName { get; set; }

        [DataMember]
        public string Password { get; set; }

        [DataMember]
        public string Discribe { get; set; }

        [DataMember]
        public DateTime SubmitTime { get; set; }
    }
}
using System;
using System.Collections.Generic;
using System.ServiceModel;

namespace IServiceClassLibrary
{
    [ServiceContract]
    public interface IUserService : IService<UserData>
    {
        [OperationContract]
        IDictionary<int, string> GetUserDict();
    }
}

 下面是Service层

using IServiceClassLibrary;
using System;
using System.Collections.Generic;

namespace ServiceClassLibrary
{
    public abstract class AbstractService<TModel> : IService<TModel> where TModel : new()
    {
        public virtual string Add(TModel tModel)
        {
            //throw new NotImplementedException();
            return "Add";
        }

        public virtual string Delete(int id)
        {
            //throw new NotImplementedException();
            return "Delete";
        }

        public virtual string Edit(TModel tModel)
        {
            //throw new NotImplementedException();
            return "Edit";
        }

        public virtual TModel GetModel(int id)
        {
            TModel tModel = new TModel();
            return tModel;
        }

        public virtual IEnumerable<TModel> GetAll()
        {
            IList<TModel> tModels = new List<TModel>();
            return tModels;
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool dispose)
        {
            if (dispose)
            {
                //CleanUp managed objects by calling thier
            }
        }
    }
}
using IServiceClassLibrary;
using System.Collections.Generic;

namespace ServiceClassLibrary
{
    public class UserService : AbstractService<UserData>, IUserService
    {
        public IDictionary<int, string> GetUserDict()
        {
            IDictionary<int, string> keyValue = new Dictionary<int, string>();
            keyValue.Add(1, "test");
            return keyValue;
        }

        protected override void Dispose(bool dispose)
        {
            if (dispose)
            {
                //CleanUp managed objects by calling thier
            }
        }
    }
}

下面是Server层,这层需要配置了,【新建】→【控制台应用程序】建好之后,【添加】→【新建项】→【WCF 服务】,建号之后,生成的两个文件可以删去了,

查看配置信息,对配置进行修改就可以了,懒人模式,高效准确。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="">
                    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <services>
            <service name="ServiceClassLibrary.UserService">
                <endpoint address="" binding="basicHttpBinding" contract="IServiceClassLibrary.IUserService">
                    <identity>
                        <dns value="localhost" />
                    </identity>
                </endpoint>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost:8733/" />
                    </baseAddresses>
                </host>
            </service>
        </services>
    </system.serviceModel>
</configuration>
using IServiceClassLibrary;
using ServiceClassLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;

namespace WCFServer
{
    class Program
    {
        static void Main(string[] args)
        {
            using (ServiceHost host = new ServiceHost(typeof(UserService)))
            {
                host.AddServiceEndpoint(typeof(IUserService),
                    new BasicHttpBinding(),
                    new Uri("http://localhost:8733/ServiceClassLibrary/UserService/"));
                if (host.State != CommunicationState.Opening)
                {
                    host.Open();
                }
                Console.WriteLine("服务已经启动!");
                Console.ReadLine();
            }
        }
    }
}

下面是客服端

using IServiceClassLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;

namespace WCFClient
{
    class Program
    {
        static void Main(string[] args)
        {
            EndpointAddress ea = new EndpointAddress("http://localhost:8733/ServiceClassLibrary/UserService/");
            IUserService proxy = ChannelFactory<IUserService>.CreateChannel(new BasicHttpBinding(), ea);
            Console.WriteLine(proxy.Delete(0));
            Console.WriteLine(proxy.GetUserDict().First());
            Console.ReadLine();
        }
    }
}

OK,WCF程序已经建立完成,先启动Server,再启动Client,程序正常运行。

如果遇到下面的问题,请以管理员身份运行就可以了。

其他的WCF文章 

1. WCF入门

2. 我的第一个WCF程序

3. Web Service 和WCF的比较

4. 基于.NET的WebService的实现和WCF的实现

以上是关于Web Service Demo图解和WCF Demo图解对比的主要内容,如果未能解决你的问题,请参考以下文章

web service, wcf, wcf rest, web api之间的区别

Web Service 和WCF

Web Service和WCF的到底有什么区别

Web Service ,WCF以及Web API的对比

Web Service和WCF的区别。其实二者不属于一个范畴!!!

按照Web Service方式调用WCF服务的问题