Pergunta

Eu tenho um endpoint JSONP WCF e estou tentando rastrear por que estou recebendo um erro 504.

HTTP/1.1 504 Fiddler - Receba falha
Tipo de conteúdo: texto/html
Conexão: Feche
Timestamp: 11: 45: 45: 9580
Falha no ReadResponse (): o servidor não retornou uma resposta para esta solicitação.

Eu posso definir um ponto de interrupção em qualquer lugar dentro do meu terminal, passar pelo código, ver ele reunir com sucesso os dados necessários para a resposta, pressionar a linha final de código e, assim que sair da chamada do WCF, recebo um erro 504. Isso estava funcionando na semana passada!

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

Meu 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 eu disse, o código percorre o tempo todo, estou tentando descobrir por que não está enviando uma resposta.

Foi útil?

Solução 3

Para esse problema em particular, acabou sendo minha string de conexão. Estando em um serviço da web, ele não estava extraindo do arquivo de configuração do site. Com um pouco de mágica (codificação dura), consegui o contexto para finalmente ativar e o sistema começou a funcionar. Ainda não totalmente através deste 504, pois tenho outros erros subjacentes agora surgindo - continuará esta resposta como eu descobrir.

1/2/2010 - Depois que limpei os erros da string de conexão, encontrei alguns erros básicos de EF que foram muito rapidamente limpos. Agora está em funcionamento novamente.

Outras dicas

Lamento não ter uma solução direta para você, mas ao perseguir problemas relacionados ao WCF, descobri que ligando os troncos do WCF, passando pelo cenário e depois passando os logs no svctraceviewer.exe Ajuda ... você terá alguma visibilidade na pilha, o que provavelmente é onde as coisas estão quebrando em você.

Você pode usar o "Editor de configuração de serviço WCF"Para ligar/desligar as várias configurações e níveis de log.

Acabei de ter um problema e rastreamento semelhante era a única maneira de identificá -lo (como já sugerido pelo @Tyler). Eu também tive um retorno HTTP 504 do servidor e também depurando o serviço no Visual Studio não mostrou nenhuma exceção. De fato, do depurador, parecia que o serviço retornou corretamente a resposta.

No meu caso particular, a causa do erro foi que um dos membros da minha classe de contrato de dados era um tipo de enumeração e os valores não foram marcados com o enummembrementAttribute.

Você pode encontrar mais informações sobre a configuração do rastreamento no WCF aqui e sobre enums em contratos de dados de serviços da WCF aqui.

Eu tive o mesmo problema duas vezes:

  • Em um cenário, uma das propriedades públicas (Datamember) só tinha getter e sem setter. Alterar esse datamember para que o Getter e o Setter resolva o problema.

  • No outro cenário, eu estava serializando/desaperando o EF4 POCO (com propriedades de navegação preenchidas) para/para o JSON e isso causou um loop recursivo durante a desserialização. Alterar o atributo do Poco para [DataContract(IsReference = true)] Ajudou a resolver o problema do loop recursivo, mas como o DataCOrtractJSoSerializer não suporta referências, eu tive que alternar o formato para XML. (Ps - Com a API da Web, o serializador JSON padrão será JSON.NET, que lidará com a referência sem problemas).

Dica: Como outros sugeriram, Loging WCF Trace É seu amigo para resolver 504 erros.

Espero que isso ajude alguém. Eu tinha um serviço WCF REST retornando JSON e Fiddler estava me dando um 504, readResponse () falhou: o servidor não retornou uma resposta para esta solicitação.

Meu problema era que eu estava devolvendo um 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 };
    }
}

E o WCF não parece entender como codificar um objeto. O objeto que eu estava retornando era totalmente bom, apenas cordas e ints. Eu tive que mudar a resposta a isso 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 };
    }
}

Teve o mesmo problema e Senario que Ododh acima. No meu caso, foi DateTime atribuir como foi NULL Na classe de resposta, como causou a resposta 504 por Fiddler. Sem problemas com NULL Atributos da string.

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

Se for ajuda a alguém, encontrei isso tentando devolver uma lista de entidades 4 `entityObject 'da Web API. Para corrigi -lo, eu apenas fiz uma seleção explícita, pois o EntityObject não gosta de ser serializado.

return Request.CreateResponse(HttpStatusCode.OK, people.Select(p => new {
    p.Id,
    p.Name,
    p.CreateDate
}));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top