c# - WCF-(504) El servidor no devolvió una respuesta para esta solicitud
asp.net http-status-code-504 (7)
Espero 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 estaba devolviendo 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. Tuve que cambiar la respuesta a esto 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 };
}
}
Tengo un JSONP WCF Endpoint y estoy tratando de rastrear por qué estoy recibiendo un error 504.
HTTP / 1.1 504 Fiddler: error de recepción
Tipo de contenido: texto / html
Conexión: cerrar
Marca de tiempo: 11: 45: 45: 9580
Error en ReadResponse (): el servidor no devolvió una respuesta para esta solicitud.
Puedo establecer un punto de interrupción en cualquier lugar dentro de mi Endpoint, paso por el código, verlo reunir los datos necesarios para la respuesta, llegar a la última línea de código, y tan pronto como salgo de la llamada de WCF aparece un error 504. ¡Esto estuvo 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 dije, el código se ejecuta completamente, así que estoy tratando de descubrir por qué no está enviando una respuesta.
Lamento no tener una solución directa para ti, pero al buscar problemas relacionados con WCF, descubrí que activar los registros de seguimiento de WCF, ejecutar el escenario y luego revisar los registros en SvcTraceViewer.exe ayuda ... obtendrás algo de visibilidad en la pila, que es donde probablemente se te descompongan las cosas.
Puede usar el " Editor de configuración de servicio de WCF " para activar / desactivar las diversas configuraciones y niveles de registro.
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.
01/02/2010 - Una vez que solucioné los errores de cadena de conexión, encontré un par de errores básicos de EF que se limpiaron muy rápidamente. Ahora está funcionando nuevamente.
Si sirve de ayuda a alguien, me encontré con esto tratando de devolver una lista de Entity Framework 4 `EntityObject ''desde 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
}));
Solo tuve un problema similar y el rastreo fue la única forma de identificarlo (como ya lo sugirió @Tyler). También recibí un retorno de HTTP 504 del 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 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 cómo configurar el rastreo en WCF here y sobre las enumeraciones en los contratos de datos de servicios de WCF here .
Tenía el mismo problema y senario que odyth arriba. En mi caso, fue el atributo DateTime
¿cómo fue 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; }
}
Tuve el mismo problema un par de veces:
En un escenario, uno de los bienes públicos (DataMember) solo tenía getter y ningún setter. Cambiar el DataMember para tener tanto getter como setter resolvió el problema.
En el otro escenario, estaba serializando / deserializando EF4 POCO (con propiedades de navegación pobladas) a / desde JSON y esto provocó 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. ( PD : con la API WEB, el serializador JSON predeterminado será JSON.NET, que manejará la referencia sin problemas).
Sugerencia: Como otros han sugerido, here es su amigo para resolver los errores 504.