Pregunta

Tengo un JSONP WCF de punto final y estoy tratando de localizar a qué estoy recibiendo un error 504.

  

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

.

Puedo establecer un punto de interrupción en cualquier lugar dentro de mi punto final, el paso a través del 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 consigo una 504 error. Esta semana pasada estaba trabajando!

[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.

¿Fue útil?

Solución 3

Para este problema particular, que terminó siendo mi cadena de conexión. Estar en un servicio web, no se retiraba del archivo de configuración del sitio web. Con un poco de magia (codificación duro) Tengo el contexto a fin de activar y el sistema comenzó a trabajar. No totalmente a través de este 504 embargo, como tengo otros errores subyacentes ahora apareciendo -. Continuará esta respuesta como lo averigüe

2/1/2010 - Una vez Despejé los errores de cadena de conexión me encontré con un par de errores EF básicas que fueron limpiados muy rápidamente. Es ahora en funcionamiento de nuevo.

Otros consejos

Lo siento no tengo una solución directa para usted, pero cuando persiguiendo a cuestiones relacionadas WCF, he encontrado que encender los registros de seguimiento de WCF, corriendo por el escenario, y luego ir a través de los registros en SvcTraceViewer.exe ayuda ... que obtendrá un poco de visibilidad en la pila que es probable que las cosas están rompiendo abajo en usted.

Puede utilizar el " WCF Servicio Editor de configuración " a su vez de encendido / apagado las diversas opciones de registros y niveles.

Yo sólo tenía un problema similar y rastreo era la única manera de identificarlo (como ya se ha sugerido por @Tyler). También tuve un HTTP 504 de retorno desde el servidor y también la depuración del servicio en Visual Studio no mostró ninguna excepción . De hecho, desde el depurador parecía que el servicio devuelto 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 de enumeración y los valores no han sido marcados con el EnumMemberAttribute.

Se puede encontrar más información sobre cómo configurar el seguimiento en WCF aquí y sobre las enumeraciones en los contratos de servicios de datos de WCF aquí .

Yo tenía el mismo problema par de veces:

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

  • En el otro escenario que se serializar / deserializar de EF4 POCO (con propiedades de navegación pobladas) a / desde JSON y esto provocó un bucle recursivo durante la deserialización. Cambiando el atributo de la POCO a [DataContract(IsReference = true)] ayudado a resolver el problema de bucle recursivo, pero desde DataContractJsonSerializer no es compatible con las referencias que tenía que cambiar el formato de XML. . ( P.S -. Con la API WEB serializador JSON por defecto será JSON.NET que se encargará de referencia sin problemas)

Sugerencia: Como otros han sugerido, WCF traza de registro es su amigo para resolver errores 504.

Esperamos que esto ayude a alguien. Tenía un servicio WCF resto de volver JSON y violinista me estaba dando un 504, ReadResponse () falló:. El servidor no devolvió una respuesta para esta solicitud

Mi problema era que yo estaba regresando de 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 };
    }
}

WCF y no parece entender cómo codificar un objeto. El objeto tuviera que volver era sólo cuerdas finas y totalmente enteros. 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 };
    }
}

tenía el mismo problema y SENARIO como odyth anteriormente. En mi caso fue atributo DateTime cómo era NULL en la clase respons, cómo causada por la respuesta 504 Fiddler. No hay problemas con 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; }
}

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

return Request.CreateResponse(HttpStatusCode.OK, people.Select(p => new {
    p.Id,
    p.Name,
    p.CreateDate
}));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top