2010-01-28 9 views
21

Ho un endpoint WCF JSONP e sto cercando di rintracciare perché sto ottenendo un errore 504.WCF - (504) Il server non ha restituito una risposta per questa richiesta

HTTP/1.1 504 Fiddler - Ricevere Failure
Content-Type: text/html
Connection: close
Timestamp: 11: 45: 45: 9580
ReadResponse() non riuscita: Il server non ha restituire una risposta per questa richiesta.

posso impostare un punto di interruzione in qualsiasi punto all'interno del mio Endpoint, eseguire il codice, vederlo raccogliere correttamente i dati richiesti per la risposta, ha colpito la riga finale del codice, quindi non appena esco della chiamata WCF Ottengo un errore 504. Questo funzionava la scorsa settimana!

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

mio 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> 

Come ho detto, il codice viene eseguito tutto il percorso attraverso cui sto cercando di capire il motivo per cui non sta inviando una risposta.

+0

qualsiasi soluzione finale con esempio di codice sorgente completo a lavorare su di esso? – Kiquenet

risposta

5

Per questo particolare problema è stata la mia stringa di connessione. Essendo in un servizio web, non stava estraendo dal file di configurazione del sito web. Con un po 'di magia (hard coding) ho finalmente attivato il Context e il sistema ha iniziato a funzionare. Non ancora completamente attraverso questo 504 come ho ora altri errori sottostanti - continuerò questa risposta come ho capito.

2/1/2010 - Una volta eliminati gli errori delle stringhe di connessione, ho trovato un paio di errori EF di base che sono stati eliminati molto rapidamente. Ora è attivo e funzionante di nuovo.

31

Mi dispiace non ho una soluzione diretta per te, ma quando inseguo i problemi relativi a WCF, ho trovato che attivare i registri di traccia WCF, scorrere attraverso lo scenario, quindi andare oltre i registri in SvcTraceViewer.exe aiuta ... avrai una certa visibilità nello stack, che è probabile che le cose si stiano abbattendo su di te.

È possibile utilizzare "WCF Service Configuration Editor" per attivare/disattivare le varie impostazioni e livelli del registro.

+1

Vedo alcuni comportamenti strani su Entity Framework che non carica il contesto richiesto.

+0

Questo mi ha aiutato a identificare e indirizzare immediatamente il mio problema! In realtà non sapevo nemmeno che si trattasse specificamente di un problema WCF. Grazie! –

+1

La tua soluzione ha risolto il mio problema dopo aver lottato per alcuni giorni !!! Il problema con le eccezioni WCF è che non si può mai sapere qual è la vera eccezione, si ottiene solo quel brutto bastardo "NotFound". – Shimmy

8

Ho appena avuto un problema simile e tracciare era l'unico modo per identificarlo (come già suggerito da @Tyler). Ho anche avuto un ritorno HTTP 504 dal server e anche il debug del servizio in Visual Studio non ha mostrato alcuna eccezione. Infatti, dal debugger sembrava che il servizio restituisse correttamente la risposta.

Nel mio caso particolare la causa dell'errore era che uno dei membri della mia classe contratto dati era un tipo enum ei valori non sono stati contrassegnati con EnumMemberAttribute.

È possibile trovare ulteriori informazioni sulla configurazione della traccia in WCF here e sulle enumerazioni nei contratti di servizi dei servizi WCF here.

+0

+1 per la traccia di configurazione nel collegamento WCF. Mi ha aiutato a trovare il problema. Per me era una classe non contrassegnata con l'attributo DataContract. – N30

4

ho avuto lo stesso problema paio di volte:

  • In uno scenario di una delle proprietà pubblica (DataMember) aveva solo getter e setter non.La modifica di DataMember per avere entrambi getter e setter risolto il problema.

  • Nell'altro scenario stavo serializzando/deserializzando EF4 POCO (con le proprietà di navigazione popolate) su/da JSON e questo ha causato un ciclo ricorsivo durante la deserializzazione. La modifica dell'attributo POCO a [DataContract(IsReference = true)] ha aiutato a risolvere il problema del ciclo ricorsivo, ma poiché DataContractJsonSerializer non supporta i riferimenti, ho dovuto passare il formato a XML. (P.S. - Con WEB API il serializzatore JSON predefinito sarà JSON.NET che gestirà il riferimento senza problemi).

Suggerimento: Come altri hanno suggerito, WCF Trace Logging è tuo amico per risolvere gli errori 504.

3

Speriamo che questo aiuti qualcuno. Ho avuto un servizio di restituzione WCF restituendo JSON e il violinista mi ha dato un 504, ReadResponse() non è riuscito: il server non ha restituito una risposta per questa richiesta.

Il mio problema era che stavo tornando un modello come questo:

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 WCF non sembra capire come codificare un oggetto. L'oggetto che stavo tornando era completamente a posto solo per archi e stringhe. Ho dovuto cambiare la risposta a questa per farlo funzionare:

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

Se si tratta di alcun aiuto a nessuno, mi sono imbattuto in questo tentativo di restituire un elenco di Entity Framework 4 `EntityObject' dal Web API. Per risolverlo, ho appena fatto fare una selezione esplicita, dal momento che EntityObject non mi piace essere serializzato.

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

Aveva lo stesso problema e senario come odyth sopra. Nel mio caso si trattava dell'attributo DateTime come era NULL nella classe di risposta, in che modo la risposta 504 di Fiddler. Nessun problema con gli attributi di stringa 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; } 
} 
Problemi correlati