2

XmlElementTreeNodeというカスタムオブジェクトを返すWCFサービスを作成しました。オブジェクトは次のようになります。

[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、サービスに渡されるXSDURIに対して検証されたXMLファイルで作成できるすべての可能な要素を表します。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>

しかし、それらの巨大な値を使用しても、同じエラーが発生します。

4

2 に答える 2

3

「NotFound」エラーは、本質的に「何かがうまくいかなかった」ことを意味するため、Silverlightの大きな問題です。デフォルトでは、サービスからの200以外のすべての応答は、SLネットワーク層によって404(Not Found)に変換され、それ以上は変換されません。情報はプログラムに提供されます。あなたができるいくつかのこと:

SLでのWCFサービスのデバッグに関するドキュメントがいくつかあります。http://blogs.msdn.com/b/silverlightws/archive/2010/09/23/debugging-wcf-services-in-silverlight.aspxに優れたビデオ(25分)があり、MSDNページがあります。http://msdn.microsoft.com/en-us/library/cc197938(v=VS.95).aspxにもいくつかの良い情報があります。

于 2011-06-07T18:15:23.187 に答える
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>
   ...
于 2011-06-08T17:41:45.210 に答える