dinghao

记录成长点滴

 

关于WebService的序列化

先看一下代码
Service部分:
    [WebMethod]
        
public SNInfo QuerySnInfoBySN(Guid SnID)
        
{
            
return    _sn.QuerySnInfo(SnID);

        }

        [WebMethod]
        
public IList QuerySnInfoByCondition(Hashtable ht,params string[] sortProperties)
        
{
            
return    _sn.QuerySnInfo(ht,sortProperties);

        }

        [WebMethod]
        
public IList QuerySnInfoByOem(string type,string Oem)
        
{
        
            
return _sn.QuerySnInfo(Type.GetType(type),Oem);
            
        }
    public IList QuerySnInfo(Hashtable conditions,  params string[] sortProperties)
        
{
            ICriteria crit 
= _coreRepository.ActiveSession.CreateCriteria(typeof(SNInfo));
            
if(conditions["Availability"!=null)
            
{
                crit.Add(Expression.Eq(
"Availability",bool.Parse(conditions["Availability"].ToString())));
            }

            
if(conditions["Deleted"!=null)
            
{
                crit.Add(Expression.Eq(
"Deleted",bool.Parse(conditions["Deleted"].ToString())));
            }

            
if(conditions["Money"!=null)
            
{
                crit.Add(Expression.Eq(
"Money",conditions["Money"]));
            }

            
if(conditions["Business"!=null)
            
{
                crit.Add(Expression.Eq(
"Business",conditions["Business"]));
            }

            
if(conditions["OEM"!=null)
            
{
                crit.Add(Expression.Eq(
"OEM",conditions["OEM"]));
            }

            
if(conditions["Sn"!=null)
            
{
                crit.Add(Expression.Eq(
"Sn",conditions["Sn"]));
            }


            
if(conditions["sAvailableDate"!=null&&conditions["eAvailableDate"!=null)
            
{
                crit.Add(Expression.Between(
"AvailableDate",DateTime.Parse( conditions["sAvailableDate"].ToString()),DateTime.Parse( conditions["eAvailableDate"].ToString())));
            }

            
if(conditions["sLn"!=null&&conditions["eLn"!=null)
            
{
                crit.Add(Expression.Between(
"Ln",conditions["sLn"],conditions["eLn"]));
            }



            
if (sortProperties != null)
            
{
                
foreach (string sortProperty in sortProperties)
                
{
                    crit.AddOrder(Order.Asc(sortProperty));
                }

            }

        
            
        
            
return crit.List();

        }

        
public IList QuerySnInfo(Type type,string Oem)
        
{
            
return QuerySnInfo(type,Oem,null);
        }

客户端部分:
            <asp:panel id="pnlResults" runat="server" cssclass="group">
                
<H4>搜索结果
                    
<asp:DataGrid id="DataGrid1" runat="server"></asp:DataGrid></H4>
                
<DIV class="pager">
                    
<CSC:PAGER id="pgrUsers" runat="server" controltopage="DataGrid1" cachedatasource="True" pagesize="10"
                        CacheDuration
="10"></CSC:PAGER></DIV>
            
</asp:panel>
private void search_Click(object sender, System.EventArgs e)
        
{
            oem 
= TextBox1.Text.Trim();
            BindCards(oem);
        }

        
private void BindCards(string oem)
        
{
            GetCardData(oem);
            
this.DataGrid1.DataBind();
        }

        
private void GetCardData(string oem)
        
{
                        
            ArrayList al 
= new ArrayList(sm.QuerySnInfoByOem("VirtualBank.VBData.SNInfo",oem));
             
            
this.DataGrid1.DataSource = al;
            
        }
执行以上程序时会抛出异常,"

ID 为“DataGrid1”的 DataGrid 未能从选定数据源自动生成任何列。

用Repeater,Eval表达式会抛出"不能绑定到字段的异常".
后来发现VS.net自动生成的代理类把SNInfo类的属性都反序列化成了字段.
解决方法:
1,手动修改代理类,如此一来,每次更新Service都要修改代理类,不方便
2,控制SOAP的序列化过程
第二种方法,不知道怎么实现,试了几种方法都不成功,求教
Hashtable会抛出" 不支持类型Hashtable,因为实现了Idictionary"
这样以来,最根本的方法还是要控制SOap的序列化过程.可是这个过程是.net自动生产的,怎么才能截获它呢?
否则就不能用很多类型的参数了

posted on 2006-05-10 12:12  思无邪  阅读(1776)  评论(2编辑  收藏  举报

导航