2011-06-07 5 views
2

XmlElementTreeNodeというカスタムオブジェクトを返すWCFサービスを作成しました。私は正常にこの方法でこれらのノードの階層構造を作成することができています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.NametheNode.Attributesを返すサービスを書きました。それらの両方が働いた。私もtheNode.Childrenを返すようにサービスを書き直しました。同じ正確なエラーが出ます。

私はこのエラーを取得するときに、サービスがなかったのでそう、私は、Silverlightでこのコードに到達することはありません「仕上げを。」

void service_GetTreeViewCompleted(object sender, GetTreeViewCompletedEventArgs e) 
{ 
    XmlElementTreeNode rootNode = e.Result; 
} 

しかし、私はこれが興味深いことを発見しました。私はreturn theNodereturn theNode.Children[0]に変更しました。だから、私はまだSilverlightにXmlElementTreeNodeオブジェクトを返しています。私がこれをしたとき、私はservice_GetTreeViewCompletedメソッドに到達し、ノードのツリーにアクセスできました(ただし、ルートノードの最初の子からのみ開始します)。私はこれがうまくいくと思っていますが、 "ルート"ノード(元のtheNode変数)ではないと思います。

誰もが、私は私のtheNode変数を返すことができますどのように任意のアイデアがありますか?私はWCFを完全に新しくしているので、おそらく私が気づいていない複雑なカスタムオブジェクトを適切に返すための別の方法があります。

更新1

XSDドキュメントによって定義されたマイXmlElementTreeNodeオブジェクトは、XML要素を表します。 XmlElementTreeNodesの生成された階層は、私のサービスに渡されるXSD URIに対して検証された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> 

しかし。

答えて

3

"NotFound"エラーは、Silverlightの大きな問題です。これは、本質的に「何かが間違っている」ことを意味します。デフォルトでは、サービスからの200以外のすべての応答はSLネットワーキングレイヤーによって404プログラムにはこれ以上の情報は与えられません。あなたが行うことができますいくつかのこと:

  • は、サーバーがクライアントに戻っていることを正確な応答を参照するには(例えばFiddlerなど)のネットワークキャプチャツールを見てください。
  • 応答が500(内部サーバーエラー)の場​​合、サーバー側にはenable tracingがあり、トレースにはエラーを説明する例外が含まれている必要があります。

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もあります。

+0

、私は私のために、この応答を得ましたサービス: "ReadResponse()が失敗しました:サーバーはこの要求に対する応答を返しませんでした。トレースを有効にする方法も見ていきます。 –

+0

ビデオはとても役に立ちました。しかし、私はそのビデオで何度も試してみたところ、どんなタイプのデバッグ結果でも1つのケースしか持っていなかった。 ServicesReferences.ClientConfigでサービスを更新して、相対パス( 'http:// localhost:12345/SchemaService.svc'の代わりに' ../ SchemaService.svc')を使用すると、TimeoutExceptionがユーザーコードによって処理されていません。サーバーがVisual StudioでNotFoundというエラーを返しました。しかし、FiddlerやViewDetail - > InnerException/StackTraceなどに何も追加されなかった。 –

+0

"ReadResponse()が失敗しました:サーバーは応答を返しませんでした" - 実際にサーバーに到達する要求ですか? http:// localhost ...を使用するときに何も表示されない場合、IIRCのフィドラーは* localhost *に送信されたリクエストを捕捉しません。マシン名に送信する必要があります(また、マシンを使用してSLページを開く必要があります) localhostではなくlocalhostを使用してドメイン間の問題を回避する) – carlosfigueira

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> 
    ... 
関連する問題