webentwicklung-frage-antwort-db.com.de

WCF - (504) Der Server hat keine Antwort auf diese Anforderung zurückgegeben

Ich habe einen JSONP-WCF-Endpunkt und versuche herauszufinden, warum ich einen Fehler 504 erhalte.

HTTP/1.1 504 Fiddler - Empfangsfehler
Inhaltstyp: Text/HTML
Verbindung: schließen
Zeitstempel: 11: 45: 45: 9580
ReadResponse () fehlgeschlagen: Der Server hat keine Antwort für diese Anforderung zurückgegeben.

Ich kann einen Haltepunkt an einem beliebigen Ort innerhalb meines Endpunkts festlegen, Code durchgehen, sehen, dass er die für die Antwort erforderlichen Daten erfolgreich sammelt, die letzte Codezeile trifft, und sobald ich den WCF-Aufruf verlasse, erhalte ich einen Fehler 504. 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, also versuche ich herauszufinden, warum er keine Antwort sendet.

21
Keith Barrows

Für dieses spezielle Problem wurde es schließlich meine Verbindungszeichenfolge. Da es sich bei einem Web-Service befand, zog es nicht die Konfigurationsdatei der Website ab. Mit etwas Magie (harte Codierung) bekam ich den Kontext, um endlich aktiviert zu werden, und das System begann zu arbeiten. Noch nicht vollständig durch diese 504, da andere zugrunde liegende Fehler jetzt auftauchen - ich werde diese Antwort fortsetzen, wenn ich es herausfinde.

01.02.2010 - Nachdem ich die Fehler der Verbindungszeichenfolge behoben hatte, fand ich einige grundlegende EF-Fehler, die sehr schnell bereinigt wurden. Jetzt ist es wieder betriebsbereit.

5
Keith Barrows

Es tut mir leid, dass ich keine direkte Lösung für Sie habe, aber wenn ich WCF-bezogene Probleme ausfindig mache, habe ich festgestellt, dass die WCF-Ablaufverfolgungsprotokolle aktiviert, das Szenario durchlaufen und dann die Protokolle in "SvcTraceViewer.exe" durchlaufen werden hilft ... Sie erhalten einen Einblick in den Stapel, der wahrscheinlich dort liegt, wo Dinge auf Sie zerbrechen.

Mit dem " WCF Service Configuration Editor " können Sie die verschiedenen Protokolleinstellungen und -ebenen ein- und ausschalten.

31
Tyler

Ich hatte gerade ein ähnliches Problem, und die Rückverfolgung war der einzige Weg, um es zu identifizieren (wie bereits von @Tyler vorgeschlagen). Ich hatte auch eine HTTP 504-Rückgabe vom Server und debuggen auch den Dienst in Visual Studio zeigte keine Ausnahme . Aus dem Debugger sah es tatsächlich so aus, als würde der Dienst die Antwort ordnungsgemäß zurückgegeben. 

In meinem speziellen Fall bestand die Fehlerursache darin, dass eines der Mitglieder meiner Datenvertragsklasse ein Aufzählungstyp war und die Werte nicht mit dem EnumMemberAttribute gekennzeichnet wurden.

Weitere Informationen zum Konfigurieren der Ablaufverfolgung in WCF hier und zu Aufzählungen in WCF-Dienstdatenverträgen finden Sie hier .

8

Ich hatte einige Male das gleiche Problem:

  • In einem Szenario hatte eine der öffentlichen Eigenschaften (DataMember) nur Getter und keinen Setter. Wenn Sie dieses DataMember so ändern, dass Getter Und Setter das Problem lösen.

  • In dem anderen Szenario habe ich EF4-POCOs (mit aufgefüllten Navigationseigenschaften) in/von JSON serialisiert/deserialisiert, und dies führte während der Deserialisierung zu einer rekursiven Schleife. Das Ändern des POCO-Attributs in [DataContract(IsReference = true)] half, das Problem der rekursiven Schleife zu lösen. Da DataContractJsonSerializer jedoch keine Referenzen unterstützt, musste ich das Format in XML ändern. ( P.S. - Bei der WEB-API wird JSON.NET als Standard-JSON-Serialisierer verwendet, der die Referenz ohne Probleme handhabt.).

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

4
muruge

Hoffentlich hilft das jemandem. Ich hatte einen WCF-Rest-Service, der JSON zurückbrachte, und Fiddler gab mir einen 504-Fehler, ReadResponse () ist fehlgeschlagen: Der Server hat keine Antwort für diese Anforderung zurückgegeben.

Mein Problem war, dass ich ein Modell wie dieses zurücksende:

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 zu verstehen, wie man ein objekt codiert. Das Objekt, das ich zurückbrachte, war vollkommen in Ordnung, nur Strings und Ints. Ich musste die Antwort darauf ä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 };
    }
}
4
odyth

Hatte das gleiche Problem und Senario wie oben. In meinem Fall war es DateTime Attribut, wie NULL in der Antwortklasse war, wie die 504-Antwort von Fiddler verursacht wurde. Keine Probleme mit NULL-Stringattributen.

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

Wenn es jemandem helfen sollte, habe ich versucht, eine Liste von Entity Framework 4 `EntityObject 'von Web Api zurückzugeben. Um das Problem zu beheben, habe ich gerade eine explizite Auswahl vorgenommen, da EntityObject nicht gerne serialisiert wird.

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