2010-01-28 4 views
21

Tengo un JSONP WCF Endpoint y estoy tratando de rastrear por qué estoy recibiendo un error 504.WCF - (504) El servidor no devolvió una respuesta para esta solicitud

HTTP/1.1 504 Fiddler - Recibir fracaso
Content-Type: text/html
Connection: close
Hora: 11: 45: 45: 9580
ReadResponse() falló: El servidor no lo hizo devolver una respuesta para esta solicitud.

puedo establecer un punto de interrupción en cualquier lugar dentro de mi punto final, desplazarse por el código, ver que se reúnen con éxito los datos necesarios para la respuesta, golpeó la última línea de código, a continuación, tan pronto como me paso fuera de la llamada WCF Me sale un error 504. ¡Esto estaba funcionando la semana pasada!

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
[ServiceContract(Name = "NegotiateService", Namespace = "http://rivworks.com/Services/2009/01/15")] 
public class NegotiateService //: svcContracts.INegotiateService 
{ 
    public NegotiateService() { } 

    [OperationContract] 
    [WebGet(ResponseFormat = WebMessageFormat.Json)] 
    public dataObjects.NegotiateSetup GetSetup(string method, string jsonInput) 
    { 
     dataObjects.NegotiateSetup resultSet = new dataObjects.NegotiateSetup(); 

     using (RivFeedsEntities1 _dbFeed = new FeedStoreReadOnly(AppSettings.FeedAutosEntities_connString, "", "").ReadOnlyEntities()) 
     { 
      using (RivEntities _dbRiv = new RivWorksStore(AppSettings.RivWorkEntities_connString, "", "").NegotiationEntities()) 
      { 
       // Deserialize the input and get all the data we need... 
       Newtonsoft.Json.Linq.JObject o = Newtonsoft.Json.Linq.JObject.Parse(jsonInput); 
       string urlRef = String.Format("{0}", o["ref"]).Replace("\"", ""); 
       string clientDate = String.Format("{0}", o["dt"]).Replace("\"", ""); 
       string ProductID = String.Format("({0})", o["productId"]).Replace("\"", ""); 
       string SKU = String.Format("{0}", o["sku"]).Replace("\"", ""); 
       string env = String.Format("{0}", o["env"]).Replace("\"", ""); 

       IList<Product> efProductList = null; 
       Product workingProduct = null; 
       vwCompanyDetails workingCompany = null; 
       bool foundItem = false; 

       if (!String.IsNullOrEmpty(SKU)) 
        efProductList = _dbRiv.Product.Include("Company").Where(a => a.SKU == SKU).ToList(); 
       else if (!String.IsNullOrEmpty(ProductID)) 
        efProductList = _dbRiv.Product.Include("Company").Where(a => a.ProductId == new Guid(ProductID)).ToList(); 

       foreach (Product product in efProductList) 
       { 
        if (String.IsNullOrEmpty(product.URLDomain)) 
        { 
         var efCompany = _dbRiv.vwCompanyDetails 
               .Where(a => a.defaultURLDomain != null && a.CompanyId == product.Company.CompanyId) 
               .FirstOrDefault(); 

         if (efCompany != null && urlRef.Contains(efCompany.defaultURLDomain)) 
         { 
          foundItem = true; 
          workingProduct = product; 
          workingCompany = efCompany; 
         } 
        } 
        else 
        { 
         if (urlRef.Contains(product.URLDomain)) 
         { 
          foundItem = true; 
          workingProduct = product; 
          workingCompany = _dbRiv.vwCompanyDetails 
                .Where(a => a.CompanyId == product.Company.CompanyId) 
                .FirstOrDefault(); 
         } 
        } 
       } 

       if (foundItem) 
       { 
        try 
        { 
         // Update the resultSet... 
         if (workingProduct != null && workingCompany != null) 
         { 
          string rootUrl = String.Empty; 
          try 
          { 
           rootUrl = AppSettings.RootUrl; 
          } 
          catch 
          { 
           rootUrl = env + @"/"; 
          } 
          resultSet.button = workingProduct.ButtonConfig; 
          resultSet.swfSource = String.Format(@"{0}flash/negotiationPlayer.swf", rootUrl); 
          resultSet.gateway = rootUrl; 
          resultSet.productID = workingProduct.ProductId.ToString(); 
          resultSet.buttonPositionCSS = workingProduct.buttonPositionCSS; 
         } 
        } 
        catch (Exception ex) 
        { 
         log.WriteLine("  ERROR: ", ex.Message); 
         log.WriteLine("STACK TRACE: ", ex.StackTrace); 
        } 
       } 
      } 
     } 
     return resultSet; 
    } 
} 

Mi web.config:

<!-- WCF configuration --> 
<system.serviceModel> 
    <behaviors> 
    <endpointBehaviors> 
     <behavior name="JsonpServiceBehavior"> 
     <webHttp /> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors> 

    <services> 
    <service name="RivWorks.Web.Service.NegotiateService"> 
     <endpoint address="" 
       binding="customBinding" 
       bindingConfiguration="jsonpBinding" 
       behaviorConfiguration="JsonpServiceBehavior" 
       contract="RivWorks.Web.Service.NegotiateService" /> 
    </service> 
    </services> 

    <extensions> 
    <bindingElementExtensions> 
     <add name="jsonpMessageEncoding" type="RivWorks.Web.Service.JSONPBindingExtension, RivWorks.Web.Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </bindingElementExtensions> 
    </extensions> 

    <bindings> 
    <customBinding> 
     <binding name="jsonpBinding" > 
     <jsonpMessageEncoding /> 
     <httpTransport manualAddressing="true"/> 
     </binding> 
    </customBinding> 
    </bindings>  
</system.serviceModel> 

Como ya he dicho, el código se ejecuta todo el camino a través de lo que estoy tratando de averiguar por qué no está enviando una respuesta.

+0

solución final con código fuente completo de muestra trabajando al respecto? – Kiquenet

Respuesta

5

Para este problema en particular, terminó siendo mi cadena de conexión. Al estar en un servicio web, no estaba extrayendo del archivo de configuración del sitio web. Con un poco de magia (codificación difícil) obtuve el Contexto para finalmente activar y el sistema comenzó a funcionar. No completamente a través de este 504 sin embargo, ya que tengo otros errores subyacentes que aparecen ahora, continuaré esta respuesta mientras lo descubro.

1/1/2010 - Una vez que solucioné los errores de la cadena de conexión, encontré un par de errores básicos de EF que se limpiaron muy rápidamente. Ahora está funcionando nuevamente.

31

Lo siento, no tengo una solución directa para usted, pero cuando persigo problemas relacionados con WCF, he encontrado que activar los registros de seguimiento de WCF, ejecutar el escenario y luego revisar los registros en SvcTraceViewer.exe ayuda ... obtendrá un poco de visibilidad de la pila, que es donde probablemente se derrumben las cosas.

Puede usar el "WCF Service Configuration Editor" para activar/desactivar las diferentes configuraciones y niveles de registro.

+1

Veo un comportamiento raro en Entity Framework que no carga el Contexto solicitado.

+0

¡Esto me ayudó a identificar y abordar mi problema de inmediato! De hecho, ni siquiera sabía que esto era específicamente un problema de WCF. ¡Gracias! –

+1

¡Su solución resolvió mi problema después de luchar con él durante unos días! El problema con las excepciones de WCF es que nunca se puede saber cuál es la verdadera excepción, solo se obtiene ese asqueroso bastardo de 'NotFound'. – Shimmy

8

Acabo de tener un problema similar y el rastreo era la única forma de identificarlo (como ya lo sugirió @Tyler). También tuve un retorno de HTTP 504 del servidor y también depuración del servicio en Visual Studio no mostró ninguna excepción. De hecho, desde el depurador parecía que el servicio devolvió correctamente la respuesta.

En mi caso particular, la causa del error fue que uno de los miembros de mi clase de contrato de datos era un tipo enum y los valores no se han marcado con EnumMemberAttribute.

Puede encontrar más información sobre la configuración de rastreo en WCF here y sobre enumeraciones en los contratos de datos de servicios de WCF here.

+0

+1 para el seguimiento de configuración en el enlace WCF. Me ayudó a encontrar el problema. Para mí era una clase que no estaba marcada con el atributo DataContract. – N30

4

tuve el mismo problema par de veces:

  • En un escenario de una de la propiedad pública (DataMember) sólo tenía getter y setter no.Cambiar ese DataMember para tener getter y setter resolvió el problema.

  • En el otro escenario estaba serializando/deserializando EF4 POCO (con propiedades de navegación pobladas) a/desde JSON y esto causó un bucle recursivo durante la deserialización. Cambiar el atributo de POCO a [DataContract(IsReference = true)] ayudó a resolver el problema de bucle recursivo, pero dado que DataContractJsonSerializer no admite referencias, tuve que cambiar el formato a XML. (P.S. - Con WEB API, el serializador JSON predeterminado será JSON.NET, que manejará la referencia sin problemas).

Consejo: Como otros han sugerido, WCF Trace Logging es su amigo para resolver errores 504.

3

Esperemos que esto ayude a alguien. Tuve un servicio de descanso WCF devolviendo JSON y violinista me dio un 504, ReadResponse() falló: el servidor no devolvió una respuesta para esta solicitud.

Mi problema era que me estaba volviendo un modelo como este:

public class ServerResult 
{ 
    public StatusCode Status { get; set; } 
    public object Data { get; set; } 

    public static ServerResult CreateServerResult(StatusCode status) 
    { 
     return new ServerResult() { Status = status }; 
    } 

    public static ServerResult CreateServerResult(StatusCode status, object data) 
    { 
     return new ServerResult() { Data = data, Status = status }; 
    } 
} 

y WCF no parece entender cómo codificar un objeto. El objeto que estaba devolviendo estaba totalmente bien solo cuerdas y entts. Tenía que cambiar la respuesta a esta para que funcione:

public class ServerResult<T> 
{ 
    public StatusCode Status { get; set; } 
    public T Data { get; set; } 

    public static ServerResult<T> CreateServerResult(StatusCode status) 
    { 
     return new ServerResult<T>() { Status = status }; 
    } 

    public static ServerResult<T> CreateServerResult(StatusCode status, T data) 
    { 
     return new ServerResult<T>() { Data = data, Status = status }; 
    } 
} 
0

Si te sirve de ayuda a cualquiera, me encontré con esta tratando de devolver una lista de Entity Framework 4 `EntityObject' de Web API. Para solucionarlo, acabo de hacer una selección explícita, ya que a EntityObject no le gusta ser serializado.

return Request.CreateResponse(HttpStatusCode.OK, people.Select(p => new { 
    p.Id, 
    p.Name, 
    p.CreateDate 
})); 
2

Tenía el mismo problema y senario que odyth arriba. En mi caso fue el atributo DateTime cómo estaba NULL en la clase respons, cómo causó la respuesta 504 de Fiddler. No hay problemas con los atributos de cadena NULL.

public class Brevutskick 
{ 
    public string DocumentCode { get; set; } 
    public string DocumentName { get; set; } 
    public string Status { get; set; } 
    public DateTime DateCreated { get; set; } 
    public string DataTemplate { get; set; } 
} 
Cuestiones relacionadas