1.创建空白Solution
选择File—New—Project—Other Project Types—Visual Studio Solution—Blank Solution
在下方输入Solution名字和路径
2.创建DataContracts
2.1 创建Test.DataContracts
右键Solution—Add—New Project—Windows—Class Library,在下方输入名字“Test.DataContracts”
右键Test.DataContracts—Properties—Application—Target framework
”Target framework”默认为”.NET Framework 4 Client Profile”,需将其设置为”.NET Framework 4”
2.2 删除Class1.cs
右键Class1.cs—Delete
2.3 创建UserInfo.cs
右键Test.DataContracts—Add—Class,在下方输入名字“UserInfo.cs”
UserInfo.cs内容
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test.DataContracts
{
[DataContract]
public class UserInfo
{
[DataMember]
public string Name { get; set; }
[DataMember]
public int Age { get; set; }
}
}
2.4 添加引用
此时UserInfo.cs会报错,需要添加引用
右键References—Add Reference—.Net—System.Runtime.Serialization
右键DataContract—Resolve—using System.Runtime.Serialization
完整UserInfo.cs内容
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
namespace Test.DataContracts
{
[DataContract]
public class UserInfo
{
[DataMember]
public string Name { get; set; }
[DataMember]
public int Age { get; set; }
}
}
3.创建Test.ServiceContracts
3.1 创建Test.ServiceContracts
右键Solution—Add—New Project—Windows—Class Library,在下方输入名字“Test.ServiceContracts”
右键Test.ServiceContracts—Properties—Application—Target framework
”Target framework”默认为”.NET Framework 4 Client Profile”,需将其设置为”.NET Framework 4”
3.2 删除Class1.cs
3.3 创建接口IService.cs
右键Test.ServiceContracts—Add—New Item—Visual C#Items—Interface,在下方输入名字“IService.cs”
IServcie.cs内容
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test.ServiceContracts
{
[ServiceContract]
public interface IService
{
[OperationContract]
[WebInvoke(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
UserInfo getUserInfo();
}
}
3.4 添加引用
右键References—Add Reference—.NET--System.ServiceModel、System.ServiceModel.Web
右键References—Add Reference—Projects--Test.DataContracts
完整IServcie.cs内容
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Web;
using Test.DataContracts;
namespace Test.ServiceContracts
{
[ServiceContract]
public interface IService
{
[OperationContract]
[WebInvoke(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
UserInfo getUserInfo();
}
}
4.创建Test.ServiceImpls
4.1 创建Test.ServiceImpls
右键Solution—Add—New Project—Windows—Class Library,下方输入名字“Test.ServiceImpls”
右键Test.ServiceImpls—Properties—Application—Target framework
”Target framework”默认为”.NET Framework 4 Client Profile”,需将其设置为”.NET Framework 4”
4.2 删除Class1.cs
4.3 创建ServiceImpl.cs
右键Test.ServiceImpl—Add—Class,在下方输入名字“ServiceImpl.cs”
ServiceImpl要实现IService接口
ServiceImpl.cs内容
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test.ServiceImpls
{
public class ServiceImpl : IService
{
public UserInfo getUserInfo()
{
UserInfo userInfo = new UserInfo();
userInfo.Name = "Tom";
userInfo.Age = 11;
return userInfo;
}
}
}
ServiceImpl里实现IService的getUserInfo方法,该方法里实例UserInfo对象,并填入Name、Age属性
4.4 添加引用
右键References—Add Reference—Projects—Test.DataContracts、Test.ServiceContracts
完整ServiceImpl.cs内容
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Test.DataContracts;
using Test.ServiceContracts;
namespace Test.ServiceImpls
{
public class ServiceImpl : IService
{
public UserInfo getUserInfo()
{
UserInfo userInfo = new UserInfo();
userInfo.Name = "Tom";
userInfo.Age = 11;
return userInfo;
}
}
}
5.创建Test.ServiceHost
5.1 创建Test.ServiceHost
右键Solution—Add—New Project—WCF—WCF Service Application,下方输入名字“Test.ServiceHost”
Test.ServiceHost的目录结构
5.2 删除App_Data、IService1.cs、Service1.svc.cs、Web.Debug.config、Web.Release.config
5.3 修改Service1.svc和Web.config
将Service1.svc改名为Test.svc
编辑Test.svc,Test.svc内容
<%@ ServiceHost Language="C#" Debug="true" Service="Test.ServiceImpls.ServiceImpl"%>
编辑Web.config,Web.config内容
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<customErrors mode="Off" />
<compilation debug="true" targetFramework="4.0">
</compilation>
<authentication mode="Windows" />
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID" />
<httpRuntime appRequestQueueLimit="10" />
</system.web>
<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
<services>
<service name="Test.ServiceImpls.ServiceImpl" behaviorConfiguration="Test.ServiceHostBehavior">
<endpoint address="TestEndpoint" behaviorConfiguration="TestBehavior" binding="webHttpBinding" contract="Test.ServiceContracts.IService" />
</service>
</services>
<bindings>
<basicHttpBinding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="Test.ServiceHostBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
<serviceThrottling maxConcurrentCalls="100" maxConcurrentSessions="100" maxConcurrentInstances="200" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="TestBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Test.ServiceHost修改后的目录结构
5.4 添加引用
右键References—Add Reference—Projects—Test.ServiceImpls
6.将WCF发布到IIS
6.1创建虚拟路径
右键Test.ServiceHost—Properties—Web—Server—Use Local IIS Web server
Project Url可以自定义。单击”Create Virtual Directory”,之后会弹出创建成功提示
在IIS下可以看到Test.ServiceHost站点
Test.ServiceHost目录结构
6.2 Debug WCF
右键Test.ServiceHost—Set as StartUp Project
单击VS工具栏的“Debug” (或按F5)
WCF部署成功会在IE下弹出如下页面
点击Test.svc弹出如下页面
7.测试WCF
利用C#访问Test.ServiceHost的getUserInfo接口
新开一个VS窗口,选择File—New—Project—Visual C#—Console Application
在下方输入Console Application名字和路径
编辑Program.cs,Program.cs内容
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
var request = (HttpWebRequest)WebRequest.Create("http://localhost/Test.ServiceHost/Test.svc/TestEndpoint/getUserInfo");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
//request.ContentLength = data.Length;
using (var stream = request.GetRequestStream())
{
//stream.Write(data, 0, data.Length);
}
var response = (HttpWebResponse)request.GetResponse();
var responseString = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();
Console.WriteLine(responseString);
Console.Read();
}
}
}
单击VS工具栏的“Debug”(或按F5),会弹出如下窗口
以上方法创建的WCF分为四个模块:DataContracts、ServiceContracts、ServiceHost、ServiceImpls。由于四个模块的代码量很小,这四个模块可以简化只剩一个ServiceHost模块,即将其余模块的代码放到ServiceHost模块。但如果代码量大的话,还是分为四个模块比较清晰。