对消息 的正文进行序列化时出错: “生成 XML 文档时出错

love_wangjiali2009 2010-02-02 11:05:07
web 服务代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using JS.Data.Model;
using JS.Data.Bll;
using Air.Com.ErroLog;
using Air.Com.Hash;
using System.Windows.Forms;
namespace JSsys.Service
{
/// <summary>
/// DocService 的摘要说明
/// </summary>
[WebService(Namespace = "http://www.uritsoft.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class JSService : System.Web.Services.WebService
{

[WebMethod(EnableSession = true)]
public void ReadPermission(object sender, string xmlfilename)
{
if (!CheckLogin()) return;
js_doc docmodel = GetSessionInfo();
try
{
//调用JS.XML.SetPermissionXml的ReadPermission函数,实现从xml文件中读取一个主窗体的权限
JS.XML.SetPermissionXml.ReadPermission((Form)sender, xmlfilename);

return;

}
catch (Exception ex)
{
WriteLog(ErroLog.ErroType.ReadXml, ex.Message, docmodel.doc_id);
}
}


JS.XML的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using Air.Com.Config;

namespace JS.XML
{
//从xml文件中读取各个控件的权限并在main加载时执行
public class SetPermissionXml
{
public static void ReadPermission(Form Sender, string XMLFilename)
{
bool isExist = false;
Air.Com.Config.XMLControl.CreatXMLFile(ref XMLFilename); //创建
XmlDocument doc = XMLControl.loadXMLDocument(XMLFilename,out isExist); //加载创建的xml文件,并返回是否加载成功
if (!isExist)
{
return; //加载不成功返回
}
ReadPermission(Sender, "//Permission", doc);
}

/// <summary>
/// 从Form读取各个控件
/// </summary>
/// <param name="Sender"></param>
/// <param name="p">xml的根节点</param>
/// <param name="doc">加载的xml文件</param>
private static void ReadPermission(Form Sender, string Permission, XmlDocument doc)
{
XMLControl.Attributes attr = new XMLControl.Attributes();
attr.name = "Name";
attr.value = Sender.Name; //取mainForm的Name属性


XmlNode root = Air.Com.Config.XMLControl.FindNode(doc, Permission + "/" + "Form", attr);//根据传来的form属性,在xml中寻找该form

if (root != null) //找到该根节点
{
Sender.Enabled = Convert.ToBoolean(root.Attributes["Enabled"].Value); //将xml文件中该节点的“Enabled”的值(false 或者 true)赋给 Form的“Enabled”属性
}

if (Sender.Controls.Count > 0)
{
foreach (Control ctr in Sender.Controls)
{
string type = ctr.GetType().Name;
switch (type)
{
case"ToolStrip":
ReadPermission((ToolStrip)ctr, Permission + "/" + root.Name, doc);
break;
case"MenuStrip":
ReadPermission((MenuStrip)ctr, Permission + "/" + root.Name, doc);
break;
default:
ReadPermission(ctr, Permission + "/" + root.Name, doc);
break;
}
}
}

}

//*********************************************************************************
private static void ReadPermission(ToolStrip Sender, string rootPath, XmlDocument doc)
{
XMLControl.Attributes attr = new XMLControl.Attributes();
attr.name = "Name";
attr.value = Sender.Name;

XmlNode node = Air.Com.Config.XMLControl.FindNode(doc, rootPath + "/" + Sender.GetType().Name, attr);

if (node != null)
{
Sender.Enabled = Convert.ToBoolean(node.Attributes["Enabled"].Value);
}

if (Sender.Items.Count > 0)
{
foreach (ToolStripItem tsi in Sender.Items)
{
ReadPermission( tsi, rootPath + "/" + node.Name, doc);
}
}
}

private static void ReadPermission(ToolStripItem Sender, string rootPath, XmlDocument doc)
{
XMLControl.Attributes attr = new XMLControl.Attributes();
attr.name = "Name";
attr.value = Sender.Name;

XmlNode node = Air.Com.Config.XMLControl.FindNode(doc, rootPath + "/" + Sender.GetType().Name, attr);
if (node != null)
{

Sender.Enabled = Convert.ToBoolean(node.Attributes["Enabled"].Value);
}
}

//**************************************************************************************************
private static void ReadPermission(MenuStrip Sender, string rootPath, XmlDocument doc)
{
XMLControl.Attributes attr = new XMLControl.Attributes();
attr.name = "Name";
attr.value = Sender.Name;

XmlNode node = Air.Com.Config.XMLControl.FindNode(doc, rootPath + "/" + Sender.GetType().Name, attr);

if (node != null)
{
Sender.Enabled = Convert.ToBoolean(node.Attributes["Enabled"].Value);
}

if (Sender.Items.Count > 0)
{
for (int i = 0; i < Sender.Items.Count; i++)
{
if (Sender.Items[i].GetType().Name == "ToolStripSeparator")
continue;
else
ReadPermission((ToolStripMenuItem)Sender.Items[i], rootPath + "/" + node.Name, doc);

}
}
}

private static void ReadPermission(ToolStripMenuItem Sender, string rootPath, XmlDocument doc)
{
XMLControl.Attributes attr = new XMLControl.Attributes();
attr.name = "Name";
attr.value = Sender.Name;

XmlNode node = Air.Com.Config.XMLControl.FindNode(doc, rootPath + "/" + Sender.GetType().Name, attr);

if (node != null)
{
Sender.Enabled = Convert.ToBoolean(node.Attributes["Enabled"].Value);
}

if(Sender.DropDownItems.Count > 0)
{
for (int i = 0; i < Sender.DropDownItems.Count; i++)
{
if (Sender.DropDownItems[i].GetType().Name == "ToolStripSeparator")
continue;
else
ReadPermission((ToolStripMenuItem)Sender.DropDownItems[i], rootPath + "/" + node.Name, doc);
}

}
}
}
}


客户端 应用程序代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Serialization;
using JSsys.App.JSService;
namespace JSsys.App
{

public partial class MainForm : Form
{
JSService.JSServiceSoapClient soapclient;
string username="未登录用户";
string LoginUserID;
public MainForm()
{
InitializeComponent();
}
public MainForm(JSService.JSServiceSoapClient soapclient,string loginuserid)
{
this.soapclient = soapclient;
LoginUserID = loginuserid;
InitializeComponent();
}
/// <summary>
/// 加载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MainForm_Load(object sender, EventArgs e)
{
js_doc docmodel;
try
{
docmodel = soapclient.GetSessionInfo();
username = docmodel.doc_name;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message );
}

try
{

soapclient.KeepOnline();
statusStrip.Items[0].Text = username + "登陆中";
statusStrip.Items[0].Enabled = true;
}
catch
{
statusStrip.Items[0].Text = username + "已经掉线";
statusStrip.Items[0].Enabled = false;
}

try
{
//执行到这句就报错了“对消息 的正文进行序列化时出错: “生成 XML 文档时出错”
soapclient.ReadPermission(this, "XMLFile1.xml");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
timer.Start();
}

我单独在客户端调用JS.XML里面的代码 程序正常运行 但是通过web调用后就出现问题了
...全文
796 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
love_wangjiali2009 2010-02-21
  • 打赏
  • 举报
回复
引用 14 楼 danjiewu 的回复:
有2个错误
Form是不能序列化的,所谓序列化就是把对象作为数据来处理,而Form显然不能当作数据处理。
还有,所谓的远程调用比如WebService、Remoting中的参数都是值传递,也就是说服务端传入的参数都是客户端参数的拷贝。想要在服务端更改客户端参数的内容是不可能的,除非你自己实现这个机制。

你可以从服务端得到xml,然后在客户端解析设置权限,这样是比较好的办法。

也只能这样了,谢谢你~
danjiewu 2010-02-10
  • 打赏
  • 举报
回复
有2个错误
Form是不能序列化的,所谓序列化就是把对象作为数据来处理,而Form显然不能当作数据处理。
还有,所谓的远程调用比如WebService、Remoting中的参数都是值传递,也就是说服务端传入的参数都是客户端参数的拷贝。想要在服务端更改客户端参数的内容是不可能的,除非你自己实现这个机制。

你可以从服务端得到xml,然后在客户端解析设置权限,这样是比较好的办法。
love_wangjiali2009 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wuyq11 的回复:]
[XmlInclude(typeof(List <MyEntity>))]
[Serializable]
public class A
{}
单步调试那里出错
[/Quote]
我在客户端的应用程序那里 添加了
[XmlInclude(typeof(MainForm))]
[Serializable] 或者
[XmlInclude(typeof(List<MainForm>))]
[Serializable]
执行到soapclient.ReadPermission(this, "XMLFile1.xml"); 就抛出异常了
ssssdffdfsdsfds 2010-02-02
  • 打赏
  • 举报
回复
rrrrr
qldsrx 2010-02-02
  • 打赏
  • 举报
回复
ASP.NET要传递Form做什么?
love_wangjiali2009 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 danjiewu 的回复:]
Form可以序列化吗?想序列化一个Form是不对的
[/Quote]
那要怎么改呢?
wuyq11 2010-02-02
  • 打赏
  • 举报
回复
[XmlInclude(typeof(List <MyEntity>))]
[Serializable]
public class A
{}
单步调试那里出错
lovexilove 2010-02-02
  • 打赏
  • 举报
回复
up
danjiewu 2010-02-02
  • 打赏
  • 举报
回复
Form可以序列化吗?想序列化一个Form是不对的
love_wangjiali2009 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zengzhan 的回复:]
从代码难看的出 你断点调试看看
[/Quote]
大哥,我调了,就是调到客户端的应用程序
soapclient.ReadPermission(this, "XMLFile1.xml");
这句是调用webservice上的
就抛出异常了
love_wangjiali2009 2010-02-02
  • 打赏
  • 举报
回复
那我压缩下代码

web 服务代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using JS.Data.Model;
using JS.Data.Bll;
using Air.Com.ErroLog;
using Air.Com.Hash;
using System.Windows.Forms;
namespace JSsys.Service
{
/// <summary>
/// DocService 的摘要说明
/// </summary>
[WebService(Namespace = "http://www.uritsoft.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class JSService : System.Web.Services.WebService
{
[WebMethod(EnableSession = true)]
public void ReadPermission(object sender, string xmlfilename)
{
if (!CheckLogin()) return;
js_doc docmodel = GetSessionInfo();
try
{
//调用JS.XML.SetPermissionXml的ReadPermission函数,实现从xml文件中读取一个主窗体的权限
JS.XML.SetPermissionXml.ReadPermission((Form)sender, xmlfilename);
return;
}
catch (Exception ex)
{
WriteLog(ErroLog.ErroType.ReadXml, ex.Message, docmodel.doc_id);
}
}
web 服务代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using JS.Data.Model;
using JS.Data.Bll;
using Air.Com.ErroLog;
using Air.Com.Hash;
using System.Windows.Forms;
namespace JSsys.Service
{
/// <summary>
/// DocService 的摘要说明
/// </summary>
[WebService(Namespace = "http://www.uritsoft.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class JSService : System.Web.Services.WebService
{

[WebMethod(EnableSession = true)]
public void ReadPermission(object sender, string xmlfilename)
{
if (!CheckLogin()) return;
js_doc docmodel = GetSessionInfo();
try
{
//调用JS.XML.SetPermissionXml的ReadPermission函数,实现从xml文件中读取一个主窗体的权限
JS.XML.SetPermissionXml.ReadPermission((Form)sender, xmlfilename);
return;
}
catch (Exception ex)
{
WriteLog(ErroLog.ErroType.ReadXml, ex.Message, docmodel.doc_id);
}
}

JS.XML的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using Air.Com.Config;
namespace JS.XML
{
//从xml文件中读取各个控件的权限并在main加载时执行
public class SetPermissionXml
{
public static void ReadPermission(Form Sender, string XMLFilename)
{
bool isExist = false;
Air.Com.Config.XMLControl.CreatXMLFile(ref XMLFilename); //创建
XmlDocument doc = XMLControl.loadXMLDocument(XMLFilename,out isExist); //加载创建的xml文件,并返回是否加载成功
if (!isExist)
{
return; //加载不成功返回
}
ReadPermission(Sender, "//Permission", doc);
}

客户端 应用程序代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Serialization;
using JSsys.App.JSService;
namespace JSsys.App
{
public partial class MainForm : Form
{
private void MainForm_Load(object sender, EventArgs e)
{
try
{
//执行到这句就报错了“对消息 的正文进行序列化时出错: “生成 XML 文档时出错”
soapclient.ReadPermission(this, "XMLFile1.xml");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
timer.Start();
}

我单独在客户端调用JS.XML里面的代码 程序正常运行 但是通过web调用后就出现问题了
qqzeng-ip 2010-02-02
  • 打赏
  • 举报
回复
从代码难看的出 你断点调试看看
  • 打赏
  • 举报
回复
好长的代码
love_wangjiali2009 2010-02-02
  • 打赏
  • 举报
回复
大哥们 帮帮小妹~~
love_wangjiali2009 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qldsrx 的回复:]
ASP.NET要传递Form做什么?
[/Quote]
因为那个Form是个主窗体
我将Form中的控件的Enabled属性写到xml文件
在加载主窗体的时候,我把它读出来

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧