WCF學習筆記(5)——wcf序列化List 並返回


本文將部署一個wcf+silverlight簡單實例,完成wcf返回我們自定義的類型,並以List<T>顯示在silverlight上,以下是詳細步驟:


 

1.new一個wcf服務,注意要申明一下我們需要返回的自定義類型,[KnownType(typeof(Terminal))](本例自定義的類型為Terminal)

    [DataContract]//實體類契約
    [KnownType(typeof(Terminal))]
    public class Terminal
    {
        [DataMember]
        public object pkCode
        {
            get;
            set;
        }
        [DataMember]
        public object sName
        {
            get;
            set;
        }
        [DataMember]
        public object fkArea
        {
            get;
            set;
        }
        [DataMember]
        public object nState
        {
            get;
            set;
        }
}

對應我們的wcf服務契約也要申明一下

    [ServiceContract]
    [ServiceKnownType(typeof(Terminal))]
    public interface IServiceData
    {
        [OperationContract]
        List<Terminal> GetTerminals();

    }
    public class ServiceData : IServiceData
    {
        public List<Terminal> GetTerminals()
        {
       //獲取業務數據,根據你的實際開發環境自行編寫  List
<Terminal> list = new List<Terminal>(); DataTable dt = IocMgr.Get<ITerminalMgr>().GetTer(); foreach (DataRow row in dt.Rows) { Terminal ter = new Terminal(); ter.pkCode = row["pkcode"]; ter.sName = row["sname"]; ter.fkArea = row["fkarea"]; ter.nState = row["nstate"]; list.Add(ter); } return list; } }

2.下面來准備一個silverlight程序來作為演示的舞台,並添加我們的wcf服務引用

簡單的布局一下我們的silverlight舞台

    <Grid x:Name="LayoutRoot">
        <sdk:DataGrid x:Name="datagrid" AutoGenerateColumns="False" Margin="12" >
            <sdk:DataGrid.Columns >
                <sdk:DataGridTextColumn Header="終端編碼" Binding="{Binding pkCode}"/>
                <sdk:DataGridTextColumn Header="點位名稱" Binding="{Binding sName}"/>
                <sdk:DataGridTextColumn Header="區域" Binding="{Binding fkArea}"/>
                <sdk:DataGridTextColumn Header="狀態" Binding="{Binding nState}"/>
            </sdk:DataGrid.Columns>
        </sdk:DataGrid>
    </Grid>

后台cs中,添加調用wcf方法

        // 當用戶導航到此頁面時執行。本例使用了導航sl程序,根據你的實際開發環境自行修改
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            Binding binding = new BasicHttpBinding();
            EndpointAddress endPoint = new EndpointAddress("http://localhost:9090/Service.svc");
            WCFServiceData.ServiceDataClient client = new WCFServiceData.ServiceDataClient(binding, endPoint);
            client.GetTerminalsCompleted += new EventHandler<WCFServiceData.GetTerminalsCompletedEventArgs>(client_GetTerminalsCompleted);
            client.GetTerminalsAsync();
        }

        void client_GetTerminalsCompleted(object sender, WCFServiceData.GetTerminalsCompletedEventArgs e)
        {
            List<WCFServiceData.Terminal> list = e.Result;
            this.datagrid.ItemsSource = list;
        }

編譯一下,你會得到如下的異常提示

分析異常,我們發現wcf序列化后返回的類型,並不是我們預想的List<Terminal>,而是Terminal[],

解決方法,需要設置一下vs的默認配置服務引用

修改數據類型中的集合類型,選擇System.Collections.Generic.List(默認為System.Array)

ok,重新編譯一下我們的項目,F5運行一下,問題解決


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM