关于WebService的序列化
先看一下代码
Service部分:
客户端部分:
后来发现VS.net自动生成的代理类把SNInfo类的属性都反序列化成了字段.
解决方法:
1,手动修改代理类,如此一来,每次更新Service都要修改代理类,不方便
2,控制SOAP的序列化过程
第二种方法,不知道怎么实现,试了几种方法都不成功,求教
Hashtable会抛出" 不支持类型Hashtable,因为实现了Idictionary"
这样以来,最根本的方法还是要控制SOap的序列化过程.可是这个过程是.net自动生产的,怎么才能截获它呢?
否则就不能用很多类型的参数了
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 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);
}
{
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>
<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;
}
执行以上程序时会抛出异常,"
{
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自动生产的,怎么才能截获它呢?
否则就不能用很多类型的参数了