15

ASP.NET MVC 4プロジェクトの同じソリューションにあるWCFサービスへのサービス参照を追加しようとしましたが、失敗しました。次のようなエラーが発生しました:

カスタムツールエラー:サービス参照「XXX」のコードを生成できませんでした。詳細については、その他のエラーおよび警告メッセージを確認してください。ルート警告は次のとおりです。

警告9カスタムツールの警告:wsdl:portTypeをインポートできません詳細:WSDLインポート拡張機能の実行中に例外がスローされました:System.ServiceModel.Description.DataContractSerializerMessageContractImporterエラー:タイプ'Newtonsoft.Json.Linq.JToken'は、再帰的なコレクションデータコントラクトです。サポートされていません。コレクション'Newtonsoft.Json.Linq.JToken'の定義を変更して、それ自体への参照を削除することを検討してください。エラーソースへのXPath:// wsdl:definitions [@ targetNamespace ='http://tempuri.org/']/wsdl:portType[@name='IXXX'] C:\ Projects ... \ Reference.svcmap 1 1 pqrt.web

サービス契約からデータ契約を削除すると、機能しました。また、ライブラリプロジェクトやASP.NET MVC 3プロジェクトなどの他のプロジェクトにサービス参照を追加しようとしましたが、すべて機能しました。これがASP.NETMVC4の問題であるかどうか疑問に思いましたか?私はVS2012RCを使用していました。

考えられる回避策の1つは、ライブラリプロジェクトにサービス参照を追加してから、ASP.NET MVC 4からライブラリプロジェクトを呼び出すことですが、これは余分な手順であるため、これを行うのは嫌です。助言がありますか?

4

4 に答える 4

14

Newtonsoft.Json への参照を保持したい場合は、アセンブリのリストから Newtonsoft.Json を除外して、datacontract の再利用を確認することもできます。

これを行うには: サービス参照を右クリックし、[サービス参照の構成...] をクリックします。

[参照されたアセンブリで型を再利用する] の下で、2 番目のオプションを選択して、再利用された型を検索するアセンブリを指定し、すべてのアセンブリを選択しますが、Newtonsoft.Json のチェックを外します。

于 2012-09-28T12:32:38.290 に答える
10

参照からNewtonsoft.Jsonを削除して、サービス参照を再度追加してみてください。

于 2012-09-06T15:33:31.763 に答える
1

JObjectエンドポイントの結果としてa を返そうとすると、コンパイル時にこのエラーが発生しました。

エンドポイントを返すようにして、object次のようなコードを作成することで回避しました。

[WebGet(UriTemplate = "SomeRequest?form_request={form_request}", ResponseFormat = WebMessageFormat.Json)]
public object SomeRequest(string form_request)
{
    dynamic result = new JObject();
    // some other code
    result.status = "success";
    return JsonConvert.SerializeObject(result);
}

たとえば、jsonp を介してサービスを消費する jQuery$.getJSON('<?>.svc/SomeRequest', 'form_request=' + webform_as_json, request_callback);は、シリアル化されたオブジェクトを次のようにアンパックします。

function request_callback(response) {
    var json = $.parseJSON(response);
    if (json.status == 'success') {
于 2013-10-01T11:38:42.307 に答える
0

本当に任意の深さのツリーでノードを返すことを意味しますか?

その場合は、JTokenを返す代わりに、最初にJTokenを文字列に変換して、JSonテキストを取得します。クライアント側ではJtoken.Parse(yourstring)、JTokenに戻ることができます。

そうでない場合は、を返し、Value<T>シリアル化でTを処理することを検討してください。

于 2012-07-18T16:48:36.480 に答える