【问题标题】:WCF application crash on passing IListWCF 应用程序在传递 IList 时崩溃
【发布时间】:2011-07-28 16:36:53
【问题描述】:

我创建了一个 WCF .Net 3.5 Rest 服务,当我通过 IList 接口时它崩溃了。我正在使用 NHibernate 来填充列表。

这是我的代码:

[OperationContract]
[WebGet(UriTemplate = "EconService/GetAllLanguage", ResponseFormat = WebMessageFormat.Json)]
public IList<Language> GetAllLanguage()
{
   IList<Language> rtnLang = Language.GetAll();
   return rtnLang;
}

这是错误信息:

请求错误

服务器在处理请求时遇到错误。例外 消息是'无法序列化类型的参数 'System.Collections.Generic.List1[Econcordia.Language]' (for operation 'GetLanguage', contract 'Service1') because it is not the exact type 'System.Collections.Generic.IList1[Econcordia.Language]' 在方法签名中并且不在已知类型集合中。在 为了序列化参数,将类型添加到已知类型 使用 ServiceKnownTypeAttribute 进行操作的集合。'。看 服务器日志以获取更多详细信息。异常堆栈跟踪是:

在 System.ServiceModel.Dispatcher.SingleBodyParameterMessageFormatter.ValidateOutputType(Type type, Type parameterType, IList`1 knownTypes)
在 System.ServiceModel.Dispatcher.SingleBodyParameterDataContractMessageFormatter.GetOutputSerializer(类型类型)
在 System.ServiceModel.Dispatcher.SingleBodyParameterMessageFormatter.CreateBodyWriter(对象 身体)
在 System.ServiceModel.Dispatcher.SingleBodyParameterMessageFormatter.SerializeReply(MessageVersion messageVersion, Object[] 参数, Object 结果)
在 System.ServiceModel.Dispatcher.ContentTypeSettingDispatchMessageFormatter.SerializeReply(MessageVersion messageVersion, Object[] 参数, Object 结果)
在 System.ServiceModel.Dispatcher.CompositeDispatchFormatter.SerializeReply(MessageVersion messageVersion, Object[] 参数, Object 结果)
在 System.ServiceModel.Dispatcher.DispatchOperationRuntime.SerializeOutputs(MessageRpc& RPC)
在 System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& RPC)
在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& RPC)
在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& RPC)
在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& RPC)
在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& RPC)
在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& RPC)
在 System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

任何帮助将不胜感激。

【问题讨论】:

  • 我用错误信息编辑了问题。
  • IList 真的是一个接口——不是一个对象......
  • 我有[OperationContract]s,它在所有地方都返回IEnumerable&lt;Whatever&gt;,并且没有任何问题。它们在代码中是 List&lt;Whatever&gt;Whatever[],但返回类型在 WCF 中对我来说工作得很好。
  • 是的,对不起!我的错。我编辑了问题。
  • @Jesse:完全相同的代码在 .Net 4 上运行,但在 3.5 上运行失败!我不知道为什么。

标签: wcf nhibernate rest asp.net-3.5


【解决方案1】:

您应该返回一个具体的List&lt;Language&gt;

[OperationContract]
[WebGet(UriTemplate = "EconService/GetAllLanguage", ResponseFormat = WebMessageFormat.Json)]
public List<Language> GetAllLanguage()
{
    IList<Language> rtnLang = Language.GetAll();
    return rtnLang.ToList();
}

希望它有效。

【讨论】:

    猜你喜欢
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 2018-06-22
    • 2014-06-28
    相关资源
    最近更新 更多