Вопрос

У меня есть конечная точка JSONP WCF, и я пытаюсь отследить, почему я получаю ошибку 504.

HTTP/1.1 504 Fiddler - Сбой приема
Тип содержимого:текст/html
Соединение:Закрыть
Временная метка:11:45:45:9580
Ошибка ReadResponse():Сервер не вернул ответ на этот запрос.

Я могу установить точку останова в любом месте внутри моей конечной точки, выполнить пошаговое выполнение кода, увидеть, как он успешно собирает данные, необходимые для ответа, нажать на последнюю строку кода, затем, как только я выхожу из вызова WCF, я получаю ошибку 504. Это работало на прошлой неделе!

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

Мой веб-файл.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>

Как я уже сказал, код выполняется полностью, поэтому я пытаюсь выяснить, почему он не отправляет ответ.

Это было полезно?

Решение 3

Для этой конкретной проблемы это оказалась моя строка подключения.Находясь в веб-службе, он не извлекался из конфигурационного файла веб-сайта.С помощью небольшого волшебства (жесткое кодирование) Я наконец-то активировал контекст, и система начала работать.Еще не полностью пройдя через этот 504, поскольку у меня сейчас появляются другие базовые ошибки - продолжу этот ответ, когда разберусь с этим.

2/1/2010 - Как только я устранил ошибки строки подключения, я обнаружил пару основных ошибок EF, которые были очень быстро устранены.Теперь он снова запущен.

Другие советы

Извините, у меня нет прямого решения для вас, но при поиске проблем, связанных с WCF, я обнаружил, что включение журналов трассировки WCF, выполнение сценария, а затем просмотр журналов в SvcTraceViewer.exe помогает...вы получите некоторую видимость стека, в котором, скорее всего, у вас все рушится.

Вы можете использовать "Редактор конфигурации службы WCF" для включения / выключения различных параметров и уровней ведения журнала.

У меня только что была похожая проблема, и отслеживание было единственным способом идентифицировать ее (как уже предлагал @Tyler).У меня также был возврат HTTP 504 с сервера, а также отладка службы в Visual Studio не показал никакого исключения.На самом деле, из отладчика это выглядело так, как будто служба правильно вернула ответ.

В моем конкретном случае причиной ошибки было то, что один из членов моего класса data contract был типом enum, и значения не были отмечены атрибутом EnumMemberAttribute .

Вы можете найти более подробную информацию о настройке трассировки в WCF здесь и о перечислениях в контрактах на передачу данных служб WCF здесь.

У меня пару раз возникала одна и та же проблема:

  • В одном сценарии у одного из общедоступных свойств (DataMember) был только получатель и не было установщика.Изменение этого элемента данных для использования обоих методов получения и setter решило проблему.

  • В другом сценарии я сериализовал / десериализовал EF4 POCO (с заполненными свойствами навигации) в / из JSON, и это вызвало рекурсивный цикл во время десериализации.Изменение атрибута POCO на [DataContract(IsReference = true)] помог решить проблему рекурсивного цикла, но поскольку DataContractJsonSerializer не поддерживает ссылки, мне пришлось переключить формат на XML.(P.S. - С WEB API сериализатором JSON по умолчанию будет JSON.NET, который будет обрабатывать ссылку без проблем).

Подсказка: Как предлагали другие, Ведение журнала трассировки WCF ваш друг, чтобы решить 504 ошибки.

Надеюсь, это кому-нибудь поможет.У меня была служба WCF rest, возвращающая JSON, и fiddler выдавал мне 504, ReadResponse() не удался:Сервер не вернул ответ на этот запрос.

Моя проблема заключалась в том, что я возвращал такую модель, как эта:

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

и wcf, похоже, не понимает, как кодировать объект.Объект, который я возвращал, был в полном порядке, только строки и целые числа.Мне пришлось изменить ответ на это, чтобы это сработало:

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

У меня была та же проблема и senario, что и у odyth выше.В моем случае это было DateTime атрибут как было NULL в классе respons, как вызван ответ 504 от Fiddler.Никаких проблем с 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; }
}

Если это кому-нибудь поможет, я столкнулся с этим, пытаясь вернуть список Entity Framework 4 `EntityObject' из Web Api.Чтобы исправить это, я просто заставил его выполнять явный выбор, поскольку EntityObject не любит сериализации.

return Request.CreateResponse(HttpStatusCode.OK, people.Select(p => new {
    p.Id,
    p.Name,
    p.CreateDate
}));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top