当前位置:编程学习 > C#/ASP.NET >>

百分求助,WebService 方法返回 hashtable 类型抱错~~~!!!

各位大虾:
    小弟我初用webservice 写了一个方法,返回的是一个hashtable 类型的变量

[WebMethod]
    public Hashtable getHash()
    {
        Hashtable hash = new Hashtable();

        hash.Add("a", "aa");
        hash.Add("b", "bb");

        return hash;
    }
编译通过,但我从浏览器浏览该页面的时候,抱错
信息如下

“/”应用程序中的服务器错误。
--------------------------------------------------------------------------------

不支持类型 System.Collections.Hashtable,因为它实现 IDictionary。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 

异常详细信息: System.NotSupportedException: 不支持类型 System.Collections.Hashtable,因为它实现 IDictionary。

源错误: 

执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。  

堆栈跟踪: 


[NotSupportedException: 不支持类型 System.Collections.Hashtable,因为它实现 IDictionary。]
   System.Xml.Serialization.TypeScope.GetDefaultIndexer(Type type, String memberInfo) +830498
   System.Xml.Serialization.TypeScope.ImportTypeDesc(Type type, MemberInfo memberInfo, Boolean directReference) +860
   System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference, Boolean throwOnError) +150
   System.Xml.Serialization.XmlReflectionImporter.ImportMemberMapping(XmlReflectionMember xmlReflectionMember, String ns, XmlReflectionMember[] xmlReflectionMembers, Boolean rpc, Boolean openModel) +78
   System.Xml.Serialization.XmlReflectionImporter.ImportMembersMapping(XmlReflectionMember[] xmlReflectionMembers, String ns, Boolean hasWrapperElement, Boolean rpc, Boolean openModel) +278

[InvalidOperationException: 反射“HelloWorldResult”时出错。]
   System.Xml.Serialization.XmlReflectionImporter.ImportMembersMapping(XmlReflectionMember[] xmlReflectionMembers, String ns, Boolean hasWrapperElement, Boolean rpc, Boolean openModel) +877
   System.Xml.Serialization.XmlReflectionImporter.ImportMembersMapping(String elementName, String ns, XmlReflectionMember[] members, Boolean hasWrapperElement, Boolean rpc, Boolean openModel, XmlMappingAccess access) +111
   System.Web.Services.Protocols.SoapReflector.ImportMembersMapping(XmlReflectionImporter xmlImporter, SoapReflectionImporter soapImporter, Boolean serviceDefaultIsEncoded, Boolean rpc, SoapBindingUse use, SoapParameterStyle paramStyle, String elementName, String elementNamespace, Boolean nsIsDefault, XmlReflectionMember[] members, Boolean validate, Boolean openModel, String key, Boolean writeAccess) +203
   System.Web.Services.Protocols.SoapReflector.ReflectMethod(LogicalMethodInfo methodInfo, Boolean client, XmlReflectionImporter xmlImporter, SoapReflectionImporter soapImporter, String defaultNs) +3596

[InvalidOperationException: 无法反射方法 test.HelloWorld。]
   System.Web.Services.Protocols.SoapReflector.ReflectMethod(LogicalMethodInfo methodInfo, Boolean client, XmlReflectionImporter xmlImporter, SoapReflectionImporter soapImporter, String defaultNs) +6904
   System.Web.Services.Description.SoapProtocolReflector.ReflectMethod() +133
   System.Web.Services.Description.ProtocolReflector.ReflectBinding(ReflectedBinding reflectedBinding) +2760
   System.Web.Services.Description.ProtocolReflector.Reflect() +739
   System.Web.Services.Description.ServiceDescriptionReflector.ReflectInternal(ProtocolReflector[] reflectors) +621
   System.Web.Services.Description.ServiceDescriptionReflector.Reflect(Type type, String url) +117
   System.Web.Services.Protocols.DocumentationServerType..ctor(Type type, String uri) +159
   System.Web.Services.Protocols.DocumentationServerProtocol.Initialize() +336
   System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing) +99

[InvalidOperationException: 无法处理请求。]
   System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing) +258
   System.Web.Services.Protocols.WebServiceHandlerFactory.CoreGetHandler(Type type, HttpContext context, HttpRequest request, HttpResponse response) +90

[InvalidOperationException: 处理请求失败。]
   System.Web.Services.Protocols.WebServiceHandlerFactory.CoreGetHandler(Type type, HttpContext context, HttpRequest request, HttpResponse response) +237
   System.Web.Services.Protocols.WebServiceHandlerFactory.GetHandler(HttpContext context, String verb, String url, String filePath) +104
   System.Web.HttpApplication.MapHttpHandler(HttpContext context, String requestType, VirtualPath path, String pathTranslated, Boolean useAppConfig) +175
   System.Web.MapHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +120
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

 
请大虾们指点一下

还有,就是我用 XmlDocument 作为返回值类型,但在接收的时候却提示是XmlNode 类型,这是为什么? --------------------编程问答-------------------- 返回的类型应该支持XML序列化

Hashtable可能不支持 所以抛出异常 --------------------编程问答-------------------- 那LS这位大虾能否解释一下,我用 XmlDocument 作为返回值类型,但在接收的时候却提示是XmlNode 类型,这是为什么?

还有,webservice 到底能用什么类型作为返回值? --------------------编程问答-------------------- webservice支持基本数据类型(就是常用的整数、布尔、字符串等),也支持自定义对象、枚举、XmlNode对象,DataSet、数组和简单集合等
XmlDocument作为返回值webservice是不支持的 --------------------编程问答-------------------- 谢谢LS 还有其它解释吗 --------------------编程问答-------------------- 不会,跟着学习 --------------------编程问答-------------------- 自己顶! --------------------编程问答-------------------- Hashtable是支持序列化的。

看样子挺怪的,Hashtable应该是从IDictionary继承的类型,但是为什么还报了因为它实现 IDictionary?

--------------------编程问答-------------------- mark --------------------编程问答-------------------- JF --------------------编程问答-------------------- 这是使用ASMX的web service最常遇到的一个问题,这是微软的设计使然,在进行XML
序列化时,不支持实现了IDictionary接口的类。印象中好像记得在WCF中已经解决了
这个问题,很多集合类都支持XML序列化。
另外,在使用XML类作为Web Service参数时,可以使用XmlElment或者XmlNode。 --------------------编程问答-------------------- 学习之..... --------------------编程问答-------------------- 如果Hashtable 支持序列化就应该没有问题,

但是你的Hashtable 中存储的类型是否也支持序列化呢? --------------------编程问答-------------------- 同意楼上
那玩意存个不可以序列化的也不行
当年深受其害啊,半天不知道为什么错...... --------------------编程问答-------------------- 有点难度哦 --------------------编程问答-------------------- 我有一个和他一样的错误,正在苦恼中………… --------------------编程问答--------------------
引用 1 楼 foyuan 的回复:
返回的类型应该支持XML序列化

Hashtable可能不支持   所以抛出异常


这个一定需要注意 --------------------编程问答-------------------- 帮顶,没用到过WS ,希望LZ早日解决。。。。。。。。 --------------------编程问答-------------------- 参考:

http://www.eggheadcafe.com/community/aspnet/2/10148431/hashtable-with-web-servic.aspx

注意答案中提到下面的链接:
http://www.dotnet247.com/247reference/a.aspx?u=http://www.markrichman.com/Collections.pdf --------------------编程问答-------------------- 自己对IDictionary 序列化就行了这个我以前也遇到过
思路:用xmlserializable类 --------------------编程问答-------------------- 楼主用DataGrid可以返回,也可以输出成xml
补充:.NET技术 ,  Web Services
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,