6

WCFサービスで単純なメソッドのみを使用すると、すべてが正常に機能します。ただし、次の方法を含めると、問題が発生します。

[OperationContract]
public List<KeyValuePair<string, string>> GetAllAccounts()
{
    return AccountBusiness.GetAllAccounts();
}

別のプロジェクトからサービスを参照すると、次のエラーが発生します。

警告5カスタムツールの警告: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 ='NodeService'] C:\ inetpub \ wwwroot \ MyclientProject \ Service References \ NodeService \ Reference.svcmap 1 1 MyClientNode

上記のメソッドを削除し、参照を再コンパイルして更新すると、正常に機能します。しかし、上記のメソッドを追加すると、常にこの警告が表示されます。

私が見つけた提案の1つは、VisualStudio2012をアンインストールしてVisualStudio2010を修復することでした。それはしたくありません。

もう1つは、「参照されているすべてのアセンブリでタイプを再利用する」のチェックを外すことを提案しましたが、これはメソッドのシグネチャを台無しにし、使用できません。

4

3 に答える 3

7

結局のところ、エラーの原因は、Json.NETを含むNuGetからMicrosoftWebAPIパッケージをインストールしたことが原因でした。これをアンインストールすると、正常に動作します。

これがあなたの答えかもしれません-そうでない場合は、インストールした(不要な)他のパッケージを調べて、それらを削除してください。

于 2012-08-22T08:52:21.143 に答える
1

サーバーにインストールされているNewtonSoft.Jsonライブラリは、NuGetからクライアントにインストールされているライブラリとは異なります。これが、サービス参照がそれを再利用できない理由です。

この場合、[指定された参照アセンブリでタイプを再利用する]をクリックし、Newtonsoft.Jsonアセンブリ以外のすべてをチェックして、再生成します。

これで、サービスリファレンスがエラーなしで生成されます。

于 2013-08-13T21:28:08.737 に答える
0

「タイプ'Newtonsoft.Json.Linq.JToken'は再帰的なコレクションデータコントラクトです」という恐ろしいエラーが発生するため、タイプJObjectまたはJTokenをWCFRESTサービスで直接返すことはできません。

JSONオブジェクトを返される前にStream型にシリアル化することでこれを修正しました...

[WebInvoke(Method = "GET",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.WrappedResponse,
UriTemplate = "/api/myGetRequest")]
public Stream myFunction(string x, string y)
{ 
  WebOperationContext webcontext = WebOperationContext.Current;
  webcontext.OutgoingResponse.Headers[HttpResponseHeader.ContentType] = "application/json";

  string json = JsonConvert.SerializeObject(myJsonObject, Newtonsoft.Json.Formatting.Indented);`

  return new MemoryStream(Encoding.UTF8.GetBytes(json ?? ""));
}
于 2021-02-25T16:44:36.667 に答える