2010-01-28 10 views
21

Ich habe einen JSONP WCF Endpoint und versuche herauszufinden, warum ich einen 504 Fehler erhalte.WCF - (504) Der Server hat keine Antwort für diese Anfrage zurückgegeben.

HTTP/1.1 504 Fiddler - Receive Failure
Content-Type: text/html
Anschluss: schließen
Zeitstempel: 11: 45: 45: 9580
Readresponse() fehlgeschlagen: Der Server hat nicht Gibt eine Antwort für diese Anfrage zurück.

ich einen Haltepunkt irgendwo in meiner Endpoint setzen kann, durch den Code Schritt, sehe sie erfolgreich die Daten für die Reaktion erforderlich sammeln, schlug die letzte Zeile des Codes, dann, sobald ich aus dem WCF Anruf Schritt Ich bekomme einen 504 Fehler. Das hat letzte Woche funktioniert!

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

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

Wie gesagt, der Code läuft den ganzen Weg durch so versuche ich, um herauszufinden, warum es nicht eine Antwort zu senden.

+0

jede endgültige Lösung mit dem vollständigen Quellcode-Beispiel, das daran arbeitet? – Kiquenet

Antwort

5

Für dieses spezielle Problem endete es als meine Verbindungszeichenfolge. Da es in einem Webdienst war, wurde es nicht von der Konfigurationsdatei der Website abgerufen. Mit ein bisschen Magie (harte Programmierung) habe ich den Kontext endlich aktiviert und das System hat angefangen zu arbeiten. Noch nicht vollständig durch diese 504, da ich jetzt andere zugrundeliegende Fehler auftelle - werde diese Antwort fortsetzen, wenn ich es herausfinde.

2/1/2010 - Sobald ich die Verbindungszeichenfolge Fehler behoben habe, fand ich ein paar grundlegende EF-Fehler, die sehr schnell aufgeräumt wurden. Es läuft jetzt wieder.

31

Es tut mir leid, ich habe keine direkte Lösung für Sie, aber wenn WCF-bezogene Probleme verfolgt werden, habe ich festgestellt, dass die WCF-Ablaufverfolgungsprotokolle aktiviert wurden und die Protokolle durchlaufen wurden in SvcTraceViewer.exe hilft ... Sie erhalten einige Einblicke in den Stapel, der wahrscheinlich ist, wo Dinge auf Sie zusammenbrechen.

Sie können die "WCF Service Configuration Editor" verwenden, um die verschiedenen Protokolleinstellungen und -stufen ein-/auszuschalten.

+1

Ich sehe ein seltsames Verhalten im Entity Framework, das den angeforderten Kontext nicht lädt.

+0

Dies hat mir geholfen, mein Problem sofort zu identifizieren und anzugehen! Ich wusste eigentlich gar nicht, dass dies speziell eine WCF-Frage war. Vielen Dank! –

+1

Ihre Lösung löste mein Problem, nachdem ich ein paar Tage damit zu kämpfen hatte !!! Das Problem mit WCF-Ausnahmen ist, dass Sie nie wissen können, was die wirkliche Ausnahme ist, Sie bekommen nur diesen fiesen "NotFound" Bastard. – Shimmy

8

Ich hatte gerade ein ähnliches Problem und Tracing war die einzige Möglichkeit, es zu identifizieren (wie bereits von @Tyler vorgeschlagen). Ich hatte auch eine HTTP 504 Rückkehr vom Server und auch das Debugging des Dienstes in Visual Studio zeigte keine Ausnahme. Tatsächlich sah es vom Debugger so aus, als ob der Dienst die Antwort korrekt zurückgegeben hat.

In meinem speziellen Fall war die Ursache des Fehlers, dass eines der Mitglieder meiner Datenvertragsklasse ein Aufzählungstyp war und die Werte nicht mit dem EnumMemberAttribute markiert wurden.

Weitere Informationen zum Konfigurieren der Ablaufverfolgung in WCF here und zu enums in WCF-Dienstdatenkontrakten here.

+0

+1 für die konfigurierende Ablaufverfolgung in der WCF-Verbindung gefunden. Es hat mir geholfen, das Problem zu finden. Für mich war es eine Klasse, die nicht mit dem Attribut DataContract gekennzeichnet war. – N30

4

hatte ich das gleiche Problem paar Mal: ​​

  • In einem Szenario einer der öffentlichen Eigentum (Datamember) hatte nur Getter und Setter keine.Wenn Sie das DataMember so ändern, dass beide Getter und Setter das Problem lösen.

  • In dem anderen Szenario Serialisierung/Deserialisierung von EF4 POCOs (mit Navigationseigenschaften gefüllt) zu/von JSON und dies verursachte eine rekursive Schleife während der Deserialisierung. Die Änderung des POCO-Attributs auf [DataContract(IsReference = true)] half dabei, das Problem der rekursiven Schleife zu lösen, aber da DataContractJsonSerializer keine Referenzen unterstützt, musste ich das Format auf XML umstellen. (P.S. - Mit Web-API wird der Standard-JSON-Serializer JSON.NET, die Referenz ohne Probleme behandelt).

Hinweis: Wie andere vorgeschlagen haben, WCF Trace Logging ist Ihr Freund 504 Fehler zu lösen.

3

Hoffentlich wird dies jemandem helfen. Ich hatte einen WCF Rest Service, der JSON zurückgab und Fiddler gab mir eine 504, ReadResponse() ist fehlgeschlagen: Der Server hat keine Antwort für diese Anfrage zurückgesendet.

Mein Problem war, dass ich ein Modell wie diese Rückkehr:

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

und wcf scheint nicht verstehen, wie ein Objekt zu codieren. Das Objekt, das ich zurückgab, war völlig in Ordnung, nur Streicher und Ints. Ich hatte die Antwort auf diese zu ändern, damit es funktioniert:

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

Wenn es irgendeine Hilfe für jeden, ich in diesen lief eine Liste von Entity Framework 4 `EntityObject‘ von Web Api zurückzukehren versuchen. Um es zu beheben, habe ich gerade eine explizite Auswahl getroffen, da EntityObject nicht serialisiert werden möchte.

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

hatte das gleiche Problem und senario wie odyth oben. In meinem Fall war es DateTime Attribut wie war NULL in der respons Klasse, wie die 504 Antwort von Fiddler verursacht. Keine Probleme mit NULL String-Attributen.

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