2012-07-18 17 views
15

Intenté agregar una referencia de servicio a un servicio WCF que reside en la misma solución de un proyecto ASP.NET MVC 4 pero que falló. Me salió un error al decir:Error al agregar la referencia de servicio: Tipo es un contrato recursivo de datos de recopilación que no es compatible

Custom tool error: Failed to generate code for the service reference 'XXX'. Please check other error and warning messages for details. The root warning is:

Warning 9 Custom tool warning: Cannot import wsdl:portType Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.DataContractSerializerMessageContractImporter Error: Type 'Newtonsoft.Json.Linq.JToken' is a recursive collection data contract which is not supported. Consider modifying the definition of collection 'Newtonsoft.Json.Linq.JToken' to remove references to itself. XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='IXXX'] C:\Projects...\Reference.svcmap 1 1 pqrt.web

Si eliminé los contratos de datos del contrato de servicio, funcionó. También intenté agregar la referencia de servicio a otros proyectos, como un proyecto de biblioteca o incluso un proyecto ASP.NET MVC 3, todo funcionó. Me preguntaba si esto era un problema con ASP.NET MVC 4? Estaba usando VS 2012 RC.

Una solución que puedo pensar es añadir la referencia de servicio a un proyecto de biblioteca y luego llamar al proyecto de biblioteca de ASP.NET MVC 4, pero odio hacerlo porque es un paso adicional. ¿Alguna sugerencia?

+0

Mi respuesta podría ser la base totalmente fuera ... se puede incluir el contrato de datos con su pregunta? –

Respuesta

0

¿Realmente quiere devolver un nodo en un árbol arbitrariamente profundo?

Si es así, en lugar de devolver un JToken, primero conviértalo en una cadena para obtener el texto de JSon. En el lado del cliente, puede Jtoken.Parse(yourstring) de nuevo en un JToken.

Si no, entonces considerar la aprobación de la espalda Value<T> y dejar que el acuerdo con la serialización T.

10

Prueba quitando Newtonsoft.Json de sus referencias y volver a agregar su referencia de servicio.

+4

Funcionó para mí. En retrospectiva, también puede ser suficiente configurar la Referencia de servicio no para "Reutilizar tipos en ensambles a los que se hace referencia" – TheXenocide

14

Si desea conservar la referencia a Newtonsoft.Json, también puede dejar Newtonsoft.Json fuera de la lista de ensamblajes para verificar la reutilización de los contactos de datos.

Para ello: Haga clic derecho con su referencia de servicio, a continuación, haga clic en Configurar Servicio de Referencia ...

En "tipos reutilización en ensamblados de referencia" seleccione la segunda opción para especificar en qué asambleas para buscar tipos reutilizados y seleccione todos los ensamblajes pero desmarque Newtonsoft.Json

+1

¿Qué sucede si tiene un servicio WCF sin una referencia de servicio? ¿Cómo se configuraría qué tipos reutilizar? – user145400

1

Tuve este error en tiempo de compilación cuando intento devolver un JObject como resultado del punto final.

llegué a su alrededor, haciendo que el retorno de punto final object y tener este tipo de código:

[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); 
} 

El jQuery consumo del servicio a través de, por ejemplo, jsonp $.getJSON('<?>.svc/SomeRequest', 'form_request=' + webform_as_json, request_callback); se descomprime el objeto serializado de este modo:

function request_callback(response) { 
    var json = $.parseJSON(response); 
    if (json.status == 'success') { 
Cuestiones relacionadas