Frage

Ich habe eine JSONP-WCF-Endpunkt und versuche auf die Spur, warum, ich bin immer ein 504-Fehler.

HTTP/1.1 504 Fiddler - Fehler Erhalten
Content-Type:text/html
Verbindung:schließen
Zeitstempel:11:45:45:9580
ReadResponse() failed:Der server hat keine Antwort für diese Anfrage.

Ich kann einen Haltepunkt irgendwo in meinem Endpunkt, Schritt durch den code, Sieh es erfolgreich sammeln die erforderlichen Daten für die Antwort, drücken Sie die Letzte Codezeile, dann, sobald ich einen Schritt aus der WCF-Aufruf bekomme ich einen 504-Fehler. Dies war die Arbeit der letzten Woche!

[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 bin ich versucht, herauszufinden, warum es nicht das senden einer Antwort.

War es hilfreich?

Lösung 3

Für dieses spezielle Problem es endete String meiner Verbindung zu sein. Als in einem Web-Service, es zog nicht aus der Konfigurationsdatei auf der Website. Mit einem wenig Magie (harte Codierung) bekam ich den Kontext, um endlich zu aktivieren und das System zu arbeiten begann. Nicht vollständig durch diese 504 noch, wie ich andere zugrunde liegende Fehler jetzt haben Aufspringen -. Wird diese Antwort, wie ich es herausfinden

2010.02.01 - Sobald ich die Verbindungszeichenfolge Fehler aufgeklärt fand ich ein paar grundlegende EF Fehler, die sich sehr schnell gereinigt. Es ist jetzt wieder läuft.

Andere Tipps

Es tut mir leid ich keine direkte Lösung für Sie, aber wenn Sie nach unten WCF-bezogene Probleme zu jagen, habe ich festgestellt, dass auf den WCF-Trace-Protokolle drehen, durch das Szenario ausgeführt wird, dann die Protokolle gehen über in SvcTraceViewer.exe hilft ... Sie werden etwas Einblick in den Stapel zu erhalten, die wahrscheinlich ist, wo die Dinge auf Sie brechen.

Sie können das " WCF Service Configuration Editor ", um wiederum Ein / aus den verschiedenen Protokolleinstellungen und Ebenen.

Ich hatte gerade ein ähnliches Problem und Verfolgung war der einzige Weg, es zu identifizieren (wie bereits von @Tyler vorgeschlagen). Ich habe auch einen HTTP-504 Rückkehr vom Server hatte und Debuggen auch den Dienst in Visual Studio zeigte keine Ausnahme . In der Tat, aus dem Debugger es wie der Dienst sah wieder richtig die Antwort.

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

Sie können weitere Informationen über die Konfiguration Tracing finden in WCF hier und etwa Aufzählungen in WCF-Dienste Datenverträge hier .

Ich hatte das gleiche Problem einige Male:

  • In einem Szenario die öffentliche Eigenschaft (DataMember) hatte nur getter und keinen setter.Ändern, dass DataMember haben sowohl get-als und setter hat das problem gelöst.

  • In dem anderen Szenario, das ich war serialisieren/Deserialisieren EF4 POCO (mit Navigation Eigenschaften gefüllt) zu/von JSON und dies verursacht eine rekursive Schleife, die während der Deserialisierung.Ändern der POCO-das Attribut [DataContract(IsReference = true)] half lösen die rekursive Schleife problem, aber da DataContractJsonSerializer unterstützt keine Verweise ich hätte wechseln können das format XML.(P. S. - Mit WEB-API den Standard-JSON-serializer werden JSON.NET die Griff Referenz ohne Probleme).

Hinweis: Wie andere vorgeschlagen haben, WCF-Ablaufverfolgung ist dein Freund zu lösen 504-Fehler.

Dies wird hoffentlich jemand helfen. Ich hatte JSON einen WCF-Rest wieder in Betrieb genommen und Fiedler gab mir ein 504 Readresponse () ist fehlgeschlagen. Der Server keine Antwort für diese Anfrage zurückkehrte

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ückkehrte, war völlig in Ordnung nur Zeichenfolgen und Ints. Ich hatte die Antwort auf diese für sie zur Arbeit zu ändern:

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

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

Wenn es irgendeine Hilfe für jeden, lief ich in diesem Versuch, eine Liste von Entity Framework zurückzukehren 4 `EntityObject‘ von Web Api. Um es zu beheben, habe ich nur tun es eine explizite Auswahl, da EntityObject nicht wie serialisiert werden.

return Request.CreateResponse(HttpStatusCode.OK, people.Select(p => new {
    p.Id,
    p.Name,
    p.CreateDate
}));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top