我创建了WCF服务,该服务返回一个名为XmlElementTreeNode的自定义对象。这就是对象的样子:
[DataContract]
public class XmlElementTreeNode
{
[DataMember]
public string Name { get; set; }
[DataMember]
public List<string> Attributes { get; set; }
[DataMember]
public List<XmlElementTreeNode> Children { get; set; }
public XmlElementTreeNode() { }
}
我能够使用这种方法成功创建这些节点的层次结构:
[OperationContract]
public XmlElementTreeNode GetTreeView(string initialSchemaUri)
{
Uri uri = new Uri(initialSchemaUri, UriKind.Absolute);
XPathSorter sorter = new XPathSorter(uri);
XmlElementTreeNode theNode = sorter.rootTreeNode;
return theNode;
}
但我得到的错误是:
CommunicationException was unhandled by user code
The remote server returned an error: NotFound.
在Reference.cs中使用此方法:
public SilverlightApplication.SchemaServiceReference.XmlElementTreeNode EndGetTreeView(System.IAsyncResult result)
{
object[] _args = new object[0];
SilverlightApplication.SchemaServiceReference.XmlElementTreeNode _result = ((SilverlightApplication.SchemaServiceReference.XmlElementTreeNode)(base.EndInvoke("GetTreeView", _args, result)));
return _result;
}
我重写了该服务以返回theNode.Name
和theNode.Attributes
。这两个都有效。我还重写了该服务以返回theNode.Children
,我得到了同样的错误。
因此,当我收到此错误时,我从未在Silverlight中访问此代码,因为该服务未“完成”。
void service_GetTreeViewCompleted(object sender, GetTreeViewCompletedEventArgs e)
{
XmlElementTreeNode rootNode = e.Result;
}
然而,我发现这很有趣。我将return theNode
更改为return theNode.Children[0]
。所以,我仍然将一个XmlElementTreeNode对象返回给Silverlight。当我这样做时,我能够到达service_GetTreeViewCompleted
方法并访问我的节点树(尽管只从根节点的第一个子节点开始)。我认为这很有用,但不是“根”节点(原始的theNode
变量)。
任何人都有任何想法如何归还theNode
变量?我对WCF完全不熟悉,所以也许还有其他方法可以正确地返回我不知道的复杂自定义对象。
更新1
我的XmlElementTreeNode
对象表示由xsd文档定义的xml元素。生成的XmlElementTreeNodes
的heiarchy表示可以在XML文件中创建的所有可能元素,这些元素是根据传递给我的服务的XSD uri验证的。事实恰恰相反,theNode.Children
的第一个元素只代表一小块节点。但是,我试图返回theNode.Children[1]
,它有数千个子节点,我得到了同样的错误。所以,我认为问题在于整个theNode
对象的大小太大了。
我尝试在Web.config中编辑我的绑定:
<binding name="SilverlightApplication.Web.SchemaService.customBinding0">
<textMessageEncoding>
<readerQuotas maxDepth="2147483647"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
</textMessageEncoding>
<httpTransport maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" />
<binaryMessageEncoding maxReadPoolSize="2147483647" maxSessionSize="2147483647" maxWritePoolSize="2147483647" />
</binding>
但是,即使有这些巨大的价值观,我也会遇到同样的错误。
答案 0 :(得分:3)
“NotFound”错误在Silverlight中是一个大问题,因为它本质上意味着“出错了” - 默认情况下,来自服务的所有非200响应都被SL网络层转换为404(未找到),并且没有进一步的信息给该计划。你可以做的一些事情:
有一些关于在SL中调试WCF服务的文档。在http://blogs.msdn.com/b/silverlightws/archive/2010/09/23/debugging-wcf-services-in-silverlight.aspx有一个很好的视频(长25分钟),http://msdn.microsoft.com/en-us/library/cc197938(v=VS.95).aspx有一个MSDN页面,还有一些很好的信息。
答案 1 :(得分:1)
正如预期的那样,问题是我返回的对象太大了。我发现我需要将以下行添加到我的Web.config:
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
在Web.config的其余部分的上下文中:
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0">
<assemblies>
<add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</assemblies>
</compilation>
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="">
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
...