WCF一步一步往前爬(一)

来源:互联网 发布:java开源流程引擎源码 编辑:程序博客网 时间:2024/06/05 08:07

第一步:

我们将建议WCF服务,和一个客户端。最后把它发布到IIS上。在开始建WCF服务之前,需要一个NBuilder.dll。我们有了它可以免去建数据库的麻烦。

1、新建一个解决方案,右键添加新建网站,选择WCF服务,地址自己确定。

2、将NBuilder引入到项目,在App_Code下新建两个数据表类tblProduct.cs,tblProductInventory.cs

usingSystem;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespaceProducts
{
/// <summary>
///tblProduct 的摘要说明
/// </summary>
public class tblProduct
{
public tblProduct()
{
//
//TODO: 在此处添加构造函数逻辑
//
}

publicint ProductID;

publicstring Name;

publicstring ProductNumber;

///<summary>
/// 0 = 产品是购买的。1 = 产品是内部生产的。
/// </summary>
public bool MakeFlag;

///<summary>
//0 = 产品不可销售。1 = 产品可销售。
/// </summary>
public bool FinishedGoodsFlag;

publicstring Color;

////最小库存量。
public int SafetyStockLevel;

///<summary>
/// 触发采购订单或工作订单的库存水平。
/// </summary>
public int ReorderPoint;

///<summary>
/// 产品的标准成本。
/// </summary>
public decimal StandardCost;

///<summary>
/// 销售价格。
/// </summary>
public decimal ListPrice;

///<summary>
/// 产品的规格。
/// </summary>
public string Size;

///<summary>
/// Size 列的测量单位。
/// </summary>
public string SizeUnitMeasureCode;


/// <summary>
/// Weight 列的测量单位。
/// </summary>
public string WeightUnitMeasureCode;

///<summary>
/// 产品的重量。
/// </summary>
public decimal Weight;

///<summary>
/// 生产产品所需的天数。
/// </summary>
public int DaysToManufacture;

///<summary>
/// R = 平地 M = 山地 T = 旅行S = 标准
/// </summary>
public string ProductLine;

///<summary>
/// H = 高 M = 中 L = 低
/// </summary>
public string Class;

///<summary>
/// W = 女式 M = 男式 U = 通用
/// </summary>
public string Style;

///<summary>
/// 产品所属的产品子类别。指向ProductSubCategory.ProductSubCategoryID 的外键。
/// </summary>
public int ProductSubcategoryID;

///<summary>
/// 产品所属的产品型号。指向ProductModel.ProductModelID 的外键。
/// </summary>
public int ProductModelID;

///<summary>
/// 产品开始销售的日期。
/// </summary>
public DateTime SellStartDate;

///<summary>
/// 产品停止销售的日期。
/// </summary>
public DateTime SellEndDate;

///<summary>
/// 产品停产的日期。
/// </summary>
public DateTime DiscontinuedDate;

///<summary>
/// 行的上次更新日期和时间。
/// </summary>
public DateTime ModifiedDate;
}
}

usingSystem;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespaceProducts
{
/// <summary>
///ProductInventory 的摘要说明
/// </summary>
public class tblProductInventory
{
public tblProductInventory()
{
//
//TODO: 在此处添加构造函数逻辑
//
}

///<summary>
/// 产品标识号。指向 Product.ProductID 的外键。
/// </summary>
public int ProductID;


/// <summary>
/// 库存位置标识号。指向 Location.LocationID 的外键。
/// </summary>
public int LocationID;


/// <summary>
/// 库存位置中的存储间。
/// </summary>
public string Shelf;

///<summary>
/// 库存位置中架子上的存储容器。
/// </summary>
public int Bin;


/// <summary>
/// 库存位置中的产品数量。
/// </summary>
public int Quantity;


/// <summary>
/// 行的上次更新日期和时间。
/// </summary>
public DateTime ModifiedDate;
}
}

2、将IService.cs重命名IProductsService.cs

usingSystem;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespaceProducts
{
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService”。
[ServiceContract]
public interface IProductsService
{

//Get the product number of every product
[OperationContract]
List<string> ListProducts();
// Get the details of a single product
[OperationContract]
ProductData GetProduct(string productNumber);
// Get the current stock level for a product
[OperationContract]
int CurrentStockLevel(string productNumber);
// Change the stock level for a product
[OperationContract]
bool ChangeStockLevel(string productNumber, short newStockLevel, string shelf,int bin);
}
}

3、将Service.cs重命名ProductsService.cs

usingSystem;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using FizzWare.NBuilder;
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、服务和配置文件中的类名“Service”。
namespace Products
{
[DataContract]
public class ProductData
{
[DataMember]
public string Name;
[DataMember]
public string ProductNumber;
[DataMember]
public string Color;
[DataMember]
public decimal ListPrice;
}

publicclass ProductsServiceImpl : IProductsService
{
static IList<tblProduct> ps =Builder<tblProduct>.CreateListOfSize(50).Build();
static IList<tblProductInventory> pis = Builder<tblProductInventory>.CreateListOfSize(50).Build();

publicList<string> ListProducts()
{
var p = ps.Select(item => item.ProductNumber).ToList();

returnp;
}

publicProductData GetProduct(string productNumber)
{

ProductData productData = null;
tblProduct matchingProduct = ps.First(item =>string.Compare(item.ProductNumber, productNumber) == 0);

productData= new ProductData()
{
Name = matchingProduct.Name,
ProductNumber = matchingProduct.ProductNumber,
Color = matchingProduct.Color,
ListPrice = matchingProduct.ListPrice
};

returnproductData;
}

public int CurrentStockLevel(stringproductNumber)
{
int stockLevel = 0;


// Calculate the sum of all quantities for the specified product
stockLevel = (from pi in pis
join p in ps
on pi.ProductID equals p.ProductID
where String.Compare(p.ProductNumber, productNumber) == 0
select (int)pi.Quantity).Sum();

returnstockLevel;
}

publicbool ChangeStockLevel(string productNumber, short newStockLevel, string shelf,int bin)
{
//var pr = Builder<tblProduct>.CreateListOfSize(50).Build();
//var pri = Builder<tblProductInventory>.CreateListOfSize(50).Build();
int productID = (from p in ps
where String.Compare(p.ProductNumber, productNumber) == 0
select p.ProductID).First();
// Find the ProductInventory object that matches the parameters passed
// in to the operation
tblProductInventory productInventory = pis.First(
pi => String.Compare(pi.Shelf, shelf) == 0 &&
pi.Bin == bin && pi.ProductID == productID);
// Update the stock level for the ProductInventory object
productInventory.Quantity += newStockLevel;
// Save the change back to the database

returntrue;
}
}
}

4、Service.svc重命名为ProductsService.svc

<%@ServiceHost Language="C#" Debug="true"Service="Products.ProductsServiceImpl"CodeBehind="~/App_Code/ProductsService.cs" %>

5、新建一个控制台客户端,命名为ProductsClient,添加对上面WCF的服务命名为ProductsService。在static void Main(string[] args){}中添加代码:

staticvoid Main(string[] args)
{
using (ProductsServiceClient proxy = new ProductsServiceClient())
{
// Test the operations in the service
// Obtain a list of all products
Console.WriteLine("Test 1: List all products");
string[] productNumbers = proxy.ListProducts();
foreach (string productNumber in productNumbers)
{
Console.WriteLine("Number: {0}", productNumber);
}
Console.WriteLine();

Console.WriteLine("Test2: Display the details of a product");
ProductData product = proxy.GetProduct("ProductNumber1");
Console.WriteLine("Number: {0}", product.ProductNumber);
Console.WriteLine("Name: {0}", product.Name);
Console.WriteLine("Color: {0}", product.Color);
Console.WriteLine("Price: {0}", product.ListPrice);
Console.WriteLine();

Console.WriteLine("Test3: Display the stock level of a product");
int numInStock = proxy.CurrentStockLevel("ProductNumber2");
Console.WriteLine("Current stock level: {0}", numInStock);
Console.WriteLine();

Console.WriteLine("Test4: Modify the stock level of a product");
if (proxy.ChangeStockLevel("ProductNumber3", 100, "Shelf3",3))
{
numInStock = proxy.CurrentStockLevel("ProductNumber3");
Console.WriteLine("Stock changed. Current stock level: {0}",numInStock);
}
}
Console.ReadKey();
}

将ProductsClient设为启动项目,看看运行结果。

 

右键WCF项目,选择发布网站,在目标位置栏,点击"..."打开对话框。选择“本地IIS”,点击“DefaultWeb Site”然后在右上角点击“创建新Web应用程序”,命名为ProductsService

OK,你发布成功了。

然后,在ProductsClient项目中,打开app.config。<client></client>中的endpoint address重新指向IIS服务。如

<client>
<endpoint address="http://localhost/ProductsService/ProductsService.svc"
binding="basicHttpBinding"bindingConfiguration="BasicHttpBinding_IProductsService"
contract="ProductsService.IProductsService"name="BasicHttpBinding_IProductsService" />
</client>

原创粉丝点击