Question

J'ai un JSONP WCF Endpoint et essaie de traquer pourquoi je reçois une erreur 504.

  

HTTP / 1.1 504 Fiddler - Recevoir défaillance
  Content-Type: text / html
  Connection: close
  Timestamp: 11: 45: 45: 9580
  ReadResponse () a échoué: Le serveur n'a pas retourné une réponse à cette demande

.

Je peux mettre un point d'arrêt partout intérieur de mon point final, étape par code, voir rassembler avec succès les données requises pour la réponse, appuyez sur la dernière ligne de code, puis dès que je l'étape de la WCF appelle je reçois un 504 erreur. Ce travaillait la semaine dernière!

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

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

Comme je l'ai dit, le code court tout le long, je suis tellement à essayer de comprendre pourquoi il n'envoie une réponse.

Était-ce utile?

La solution 3

Pour ce problème particulier, il a fini par être ma chaîne de connexion. Être dans un service Web, il ne faisait pas à partir du fichier de configuration du site Web. Avec un peu de magie (codage en dur) Je suis le contexte pour finalement activer et le système commencé à travailler. Pas complètement à travers ce 504 encore que j'ai d'autres erreurs sous-jacentes popping maintenant -. Continuera cette réponse que je figure it out

2/1/2010 - Une fois que je franchis les erreurs de chaîne de connexion j'ai trouvé une erreur EF de base couple qui ont été très rapidement nettoyés. Il est maintenant en marche à nouveau.

Autres conseils

Je suis désolé, je n'ai pas de solution directe pour vous, mais quand pourchassant les questions liées WCF, j'ai trouvé que d'allumer les journaux de suivi WCF, en cours d'exécution à travers le scénario, en passant ensuite sur les journaux en SvcTraceViewer.exe aide ... vous aurez une certaine visibilité dans la pile qui est probable où les choses se délitent sur vous.

Vous pouvez utiliser le " service WCF éditeur de configuration " pour activer on / off les différents paramètres du journal et des niveaux.

Je viens d'avoir un problème similaire et le suivi était le seul moyen de l'identifier (comme déjà suggéré par @Tyler). J'ai eu aussi un retour HTTP 504 à partir du serveur et le débogage également le service dans Visual Studio n'a pas montré d'exception . En fait, depuis le débogueur, il avait l'air comme le service correctement retourné la réponse.

Dans mon cas particulier, la cause de l'erreur a été que l'un des membres de ma classe de contrat de données était un type ENUM et les valeurs n'ont pas été marqués du EnumMemberAttribute.

Vous pouvez trouver plus d'informations sur la configuration de traçage dans WCF et A propos énumérations dans les services WCF contrats de données .

J'ai eu le même couple d'émission de fois:

  • Dans un scénario un des biens publics (DataMember) seulement avaient getter et aucun poseur. La modification que DataMember ait à la fois getter et setter a résolu le problème.

  • Dans l'autre scénario que je sérialisation / désérialisation de EF4 POCO (avec des propriétés de navigation peuplées) à / de JSON et cela a provoqué une boucle récursive lors de la désérialisation. Modification de l'attribut de Poco à [DataContract(IsReference = true)] aidé à résoudre le problème de la boucle récursive, mais étant donné que DataContractJsonSerializer ne supporte pas les références que je devais changer de format XML. ( P.S -. Avec l'API WEB par défaut JSON sérialiseur sera JSON.NET qui se chargera de référence sans problèmes).

Conseil: Comme d'autres l'ont suggéré, WCF Connexion Trace est votre ami pour résoudre 504 erreurs.

Espérons que cela vous aidera quelqu'un. J'ai eu un service de repos WCF retour JSON et Fiddler me donner un 504, ReadResponse () a échoué. Le serveur n'a pas retourné une réponse à cette demande

Ma question était que je rentrais d'un modèle comme celui-ci:

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

et WCF ne semble pas comprendre comment coder un objet. L'objet que je rentrais était tout à fait bien seulement des cordes et ints. Je devais changer la réponse à ce que cela fonctionne:

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

eu le même problème et que senario odyth ci-dessus. Dans mon cas, il était DateTime attribuer comment comment causé la 504 réponse par Fiddler a été NULL dans la classe responsab,. Aucun problème avec les attributs de chaîne de 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; }
}

S'il est une aide à tout le monde, je suis tombé sur ce en essayant de retourner une liste de Entity Framework 4 `EntityObject » du Web Api. Pour résoudre ce problème, je viens de faire ce faire une sélection explicite, puisque EntityObject n'aime pas être sérialisé.

return Request.CreateResponse(HttpStatusCode.OK, people.Select(p => new {
    p.Id,
    p.Name,
    p.CreateDate
}));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top