Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 为什么我不能一致地序列化“哈希表”?_Asp.net_Vb.net - Fatal编程技术网

Asp.net 为什么我不能一致地序列化“哈希表”?

Asp.net 为什么我不能一致地序列化“哈希表”?,asp.net,vb.net,Asp.net,Vb.net,昨天,我编写了一个web方法来返回报告的问题: _ _ _ _ 公共课(拉斐尔) 继承System.Web.Services.WebService _ _ 公共函数GetReportedProblems(ByVal路径名为字符串)作为哈希表 当我尝试使用web方法时,出现以下错误: 不支持System.Collections.Hashtable类型,因为它实现了IDictionary A让我意识到,我显然不应该在不做一些工作的情况下获得由.Net序列化的哈希表 我的困惑源于这样一个事实:我通常

昨天,我编写了一个web方法来返回报告的问题:

_
_
_
_
公共课(拉斐尔)
继承System.Web.Services.WebService
_
_
公共函数GetReportedProblems(ByVal路径名为字符串)作为哈希表
当我尝试使用web方法时,出现以下错误:

不支持System.Collections.Hashtable类型,因为它实现了IDictionary

A让我意识到,我显然不应该在不做一些工作的情况下获得由.Net序列化的
哈希表

我的困惑源于这样一个事实:我通常使用
HashTable
对象作为web方法的返回(主要是因为它非常接近JavaScript对象,而且非常方便)

我编写的一个web方法示例,返回一个
哈希表(它工作得非常好):

_
部分类_Lugash_Gopher
继承ppcBasePage',它继承System.Web.UI.Page
_
_
公共共享函数GetAgentsPaged(ByVal iDisplayStart为整数,ByVal iDisplayLength为整数,ByVal sEcho为整数,ByVal TeamID为整数)作为哈希表
我填充
哈希表
h
),如下所示:

h.Add(“TeamID”,TeamID)”整数
h、 添加(“sEcho”,sEcho)”整数(将“s”前缀归咎于DataTables.Net)
h、 添加(“iTotalRecords”,iTotalRecords)”整数
h、 添加(“iTotalDisplayRecords”,iTotalDisplayRecords)”整数
h、 Add(“aaData”,Helpers.ConvertDataTableToJSON(ds.Tables(1)))方法返回System.Array
返回(示例):

{
“d”:{
“iTotalRecords”:2,
“iTotalDisplayRecords”:10,
“团队名称”:“所有团队”,
“aaData”:[{
“下一个到期日”:“2014年1月1日”,
“准备好反馈”:0,
“emp_名称”:“John Doe”,
“行”:1,
“不完整的反馈”:1,
“emp_id”:1
}, {
“下一个到期日”:“2014年1月14日”,
“准备好反馈”:0,
“emp_名称”:“简·史密斯”,
“行”:2,
“不完整的反馈”:1,
“emp_id”:2
}],
"sEcho":1,,
“团队ID”:1
}
}
方法
GetReportedProblems
位于
.asmx
代码隐藏中,允许
GET

方法
GetAgentsPaged
位于
.aspx
代码隐藏中,需要
POST

这是我能在方法结构中确定的唯一两个差异


为什么我能够在
.aspx
代码隐藏中使用
哈希表作为web方法的返回类型,但在a
.asmx
代码隐藏中却不能使用它?

我在这里找到了您问题的答案。但部分答案是你自己已经发现的,从你所描述的

所以你要问的下一个大问题是,为什么一个简单的ASPX可以完成ASMX无法完成的工作?答案是因为ASMX主要基于XML,与ASMX的所有通信都基于SOAP。为了使其正常工作,Microsoft通过ScriptManager(我相信您就是这么做的)巧妙地开发和处理了ASP.NET:

(…)要从脚本启用Web服务调用,必须在应用程序的Web.config文件中注册ScriptHandlerFactory HTTP处理程序。处理程序处理从脚本到.asmx Web服务的调用。以下示例显示用于添加处理程序的Web.config元素。(…)

但在剩下的时间里,web服务仍然是基于XML的,就像人们所认为的:

(…)对于不是从ASP.NET AJAX脚本发出的Web服务调用,ScriptHandlerFactory处理程序将调用委托给默认处理程序,它使用SOAP而不是JSON格式。委派是自动执行的,您不必采取任何行动,除非您想禁用对Web服务使用SOAP协议。在这种情况下,必须在Web.config文件中输入以下配置设置。(……)

(…)若要启用从ASP.NET网页中的客户端脚本调用.asmx Web服务,必须向该网页添加ScriptManager控件。通过将asp:ServiceReference子元素添加到ScriptManager控件,然后将服务器引用路径属性设置为Web服务的URL,可以引用Web服务ServiceReference对象指示ASP.NET生成JavaScript代理类,用于从客户端脚本调用指定的Web服务。(…)

注:此信息摘自

继续,那么为什么在ASMXWeb服务中收到该错误呢?您收到这个错误是因为编译器告诉您“嘿,当有人打电话给我(xml web服务)时,如果您有办法告诉编译器“嘿,但是我答应打电话给您(xml ws)”,那么大多数时候我可能会用xml和实现IDictionary的哈希表响应,它们不能转换为xml!”只有通过ScriptManager(通过ASP.NET处理程序实现的代理与您对话)从ASP.NET页面开始,您的代码才能工作,但ASMX WebService不允许您执行此类配置

这就是为什么XMLWebservices(asmx)会出错,而ASP.NET不会,因为ASP.NET不会以XML响应,它会以您希望它响应的方式响应,因为开发人员可以任意决定是发送JSON、HTML、XML、文本还是基于二进制的响应

如果我是你,我会向前迈出一小步,我会尝试指定你的Web方法输出XML(在你的ASP.NET页面中),看看它是否会引发同样的错误,我没有尝试过,但最肯定的是会发生这种情况

更新1

请注意,标记ScriptService没有指定继承,它只是一个注释,pro