2011年7月28日 星期四

WCF教學(10) - 設計Service、Operation 與Data Contract

設計服務合約 (Service Contract)與作業合約(Operation Contract)都可以利用attribute來變更命名空間,或是名稱,我們來看看常用的attribute。
image
  • 使用Visual Studio 2010 Command Prompt,執行wcftestclient.exe
  • Add Service
image
  • 輸入服務URL
image
  • 預設範本中提供一個IService Contract,以及有一個GetData Operation。你可以雙擊GetData,輸入參數,並按Invoke按鈕叫用服務。
image
  • 修改IService.cs,ServiceContract與GetData Operation,加上Name與Namespace
[ServiceContract(
Name = "IContract",
Namespace = "http://www.test.com"
)]
public interface IService
{
    [OperationContract(
    Name = "DoGetData", Action = "http://www.test.com/DoGetData")]
    string GetData(int value);
    [OperationContract]
    CompositeType GetDataUsingDataContract(CompositeType composite);
}
  • 重複以上步驟,使用Visual Studio 2010 Command Prompt,執行wcftestclient.exe,服務的合約與Operation的名稱便會更改
image
  • 加一個Console Client到Solution,ConClient
  • ConClient,Add Service  Reference->Discovery->OK
  • 修改Main,設定Service Contract與Operation Contract名稱會影響Proxy類別的命名,因此Main程式要改如下,才可叫用服務
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConClient
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceReference1.ContractClient proxy = new ServiceReference1.ContractClient();
            Console.WriteLine(proxy.DoGetData(10));
        }
    }
}

預設使用DataContract時,只有有標示DataMember的成員才會被序列化,設計DataContract時也可以套用很多attribute
  • 修改MyWCFService,IService.cs,預設的CompositeType class,加上Namespace
[DataContract(Namespace = "http://www.aaa.com")]
public class CompositeType
{ //略
  • 執行svc,然後在 url 後方輸入?xsd=xsd0
  • 可以看到namespace變更了
image
image
  • 修改程式碼,設定DataMember的Name與Order
[DataContract(Namespace = "http://www.aaa.com")]
public class CompositeType
{
    bool boolValue = true;
    string stringValue = "Hello ";
    [DataMember(Name = "myBoolValue", Order = 1)]    public bool BoolValue
    {
        get { return boolValue; }
        set { boolValue = value; }
    }
   [DataMember(Name = "myStringValue", Order = 0)]    public string StringValue
    {
        get { return stringValue; }
        set { stringValue = value; }
    }
}
image
變更DataContract不會影響到Proxy的產生,因此ConClient程式不用做任何修改還是可以正常執行。

沒有留言:

總瀏覽量