第一步:
我們將建議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>