2011-03-07 5 views
4

であり、それはあなたがパディングとここにコードこのarticleとMSDNの記事JSONの無効なルート要素名 'HTML'が見つかりました。 「ルート」は、私は、MSDNのサンプルコードを使用しています唯一の許可ルート要素名

を見つけることができますJSONPラッパーファイルを持っている(AJAX)

Encountered invalid root element name 'HTML'. 'root' is the only allowed root element name

それが何を意味する:私は、コードを実行すると、それは私にこのエラーをスロー?

enter image description here

答えて

5

それはあなたが戻ってXMLデータのいくつかの種類を取得するために期待しているが、代わりにそれが戻っHTMLデータを取得しているWeb要求のいくつかの種類を作ったことを意味します。通常の原因は、乱雑なURLです。 URLが正しい場合、XMLは期待通りに返されます。それがうまくいけば、あなたはHTML(おそらくエラーページ)を取り戻すことになります。

URLが正しいことを確認してください。

2

私は同様の問題を解決しました。私の場合、私のサービスが生のJSONを返すとき、つまりこのJSONを表すStreamを返すと言っても、同様のエラーが発生していました。

エラーは次のとおりです。無効なルート要素名 'Binary'が検出されました。 'root'は唯一許可されているルート要素名です。

問題は、MSが提供する例ではJsonWriterを使用してメッセージをJSONに変換しますが、この作者は自分のメッセージがストリームに変換できるJSONオブジェクトで構成されていると予想しています。私の場合、メッセージはバイナリデータを構成していたので、 "ルート"要素の代わりに "バイナリ"要素を持っていました。

MSサンプルで提供されているクラスを変更してこの問題を解決しました。基本的に私はメッセージのフォーマットをチェックします.JSONならばJsonWriterを使うことができます。バイナリの場合は別の方法をとる必要があります。あなたのケースでは、メッセージはHTML形式です(私はどのようにそれを提供するのか分かりません)が、メッセージの本文を取得する別の方法を見つけるでしょう。

私はここに私の問題についてのブログ記事を書いた:http://hoonzis.blogspot.com/2011/07/provide-jsonp-with-your-wcf-services.html

は、それが少しホープ、Honza

0

は、私は同じエラーメッセージの中に、異なるシナリオで実行されていました。私は、XMLだけをサポートするWCF WebサービスにJSONサポートを追加していました。

具体的には、JSONのエラーメッセージオブジェクトも返すことにしました。 私はSystem.ServiceModel.Dispatcher.IErrorHandlerを実装していたクラスを持っていました。 ProvideFaultメソッドの中で、私は `WebBodyFormateMessagePropertyをacceptヘッダーで渡された内容に基づいて対応するもの、XMLまたはJSONに設定しました。それに応じてコンテンツタイプも設定していました。私が行方不明になったことは

Dim webBodyFormatMessageProp As Channels.WebBodyFormatMessageProperty 
    Dim contentType As String 
    Dim serializer As XmlObjectSerializer 
    If WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Json Then 
     webBodyFormatMessageProp = New System.ServiceModel.Channels.WebBodyFormatMessageProperty(System.ServiceModel.Channels.WebContentFormat.Json) 
     contentType = "application/json" 
     serializer = New DataContractJsonSerializer(GetType(MyErroClass)) 
    Else 
     webBodyFormatMessageProp = New System.ServiceModel.Channels.WebBodyFormatMessageProperty(System.ServiceModel.Channels.WebContentFormat.Xml) 
     contentType = "text/xml" 
     serializer = New DataContractSerializer(GetType(MyErroClass)) 
    End If 

    Dim detail = faultException.[GetType]().GetProperty("Detail").GetGetMethod().Invoke(faultException, Nothing) 
    fault = System.ServiceModel.Channels.Message.CreateMessage(version, "", detail, serializer) 
    fault.Properties.Add(System.ServiceModel.Channels.WebBodyFormatMessageProperty.Name, webBodyFormatMessageProp) 

    Dim httpResponseMessageProp = New System.ServiceModel.Channels.HttpResponseMessageProperty() 
    httpResponseMessageProp.Headers(System.Net.HttpResponseHeader.ContentType) = contentType 
    httpResponseMessageProp.StatusCode = System.Net.HttpStatusCode.OK 
    httpResponseMessageProp.StatusDescription = [error].Message 

    fault.Properties.Add(System.ServiceModel.Channels.HttpResponseMessageProperty.Name, httpResponseMessageProp) 

各ケースの正しいシリアライザを使用していたVB.netを謝るが、それは、私が現在働いているものです。

関連する問題