我创建了 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
表示可以在 XML 文件中创建的所有可能元素,该文件针对传递到我的服务的 XSD uri 进行验证。碰巧 的第一个元素theNode.Children
仅代表一棵小节点树。但是,我尝试 return 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>
但是,即使有这些巨大的价值,我也会得到同样的错误。