WCF - (504) Сервер не ответил на этот запрос
У меня есть конечная точка JSONP WCF и пытаюсь выяснить, почему я получаю ошибку 504.
HTTP/1.1 504 Fiddler - получение отказа
Content-Type: text/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;
}
}
Мой 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>
Как я уже сказал, код проходит весь путь, поэтому я пытаюсь понять, почему он не отправляет ответ.
Ответы
Ответ 1
Для этой конкретной проблемы она оказалась моей строкой соединения. Будучи в веб-сервисе, он не вытягивался из файла конфигурации веб-сайта. С небольшим количеством магии (жесткое кодирование) я получил контекст, чтобы, наконец, активировать и система начала работать. Не полностью через это 504, но, поскольку у меня есть другие основные ошибки, которые появляются сейчас, продолжит этот ответ, когда я это выясню.
2/1/2010 - Как только я очистил ошибки строки подключения, я обнаружил пару основных ошибок EF, которые были очень быстро очищены. Теперь он снова запущен.
Ответ 2
Извините, у меня нет прямого решения для вас, но, преследуя проблемы, связанные с WCF, я обнаружил, что включение журналов трассировки WCF выполняется по сценарию, а затем перебирает журналы в SvcTraceViewer.exe помогает... вы получите некоторую видимость в стеке, который, вероятно, там, где все обрушится на вас.
Вы можете использовать " редактор конфигурации службы WCF", чтобы включить/выключить различные параметры и уровни журнала.
Ответ 3
У меня была аналогичная проблема, и трассировка была единственным способом ее идентифицировать (как уже было предложено @Tyler). У меня также был HTTP 504 возврат с сервера, а также отладка службы в Visual Studio не показывала никакого исключения. Фактически, из отладчика было похоже, что служба правильно вернула ответ.
В моем конкретном случае причиной ошибки было то, что один из членов класса контрактов данных был типом перечисления, и значения не были отмечены с помощью EnumMemberAttribute.
Дополнительную информацию о настройке трассировки в WCF здесь и о перечислениях в контрактах данных служб WCF .
Ответ 4
У меня была такая же проблема пару раз:
-
В одном сценарии одно из публичного имущества (DataMember)
геттер и нет сеттера. Изменение этого DataMember, чтобы иметь как getter
и сеттер решил проблему.
-
В другом сценарии я сериализовал/десериализовал EF4 POCO (с включенными свойствами навигации) в/из JSON, и это вызвало рекурсивный цикл во время десериализации. Изменение атрибута POCO на [DataContract(IsReference = true)]
помогло решить проблему рекурсивного цикла, но поскольку DataContractJsonSerializer не поддерживает ссылки, мне пришлось переключать формат в XML. ( P.S.. С WEB API по умолчанию JSON-сериализатор будет JSON.NET, который будет обрабатывать ссылку без проблем).
Подсказка: Как предложили другие, Журналы трассировки WCF - ваш друг решить ошибки 504.
Ответ 5
Надеюсь, это поможет кому-то. У меня была служба обслуживания WCF, возвращающая JSON, а скрипт давал мне 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, похоже, не понимают, как закодировать объект. Объект, который я возвращал, был полностью прав, только строки и ints. Мне пришлось изменить ответ на это, чтобы он работал:
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 };
}
}
Ответ 6
Была та же проблема и сенарио, что и выше. В моем случае атрибут DateTime
был NULL
в классе ответственности, как вызвал ответ 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; }
}
Ответ 7
Если это кому-то поможет, я столкнулся с этим, пытаясь вернуть список Entity Framework 4 `EntityObject 'из Web Api. Чтобы исправить это, я просто сделал его явным выбором, поскольку EntityObject не нравится сериализоваться.
return Request.CreateResponse(HttpStatusCode.OK, people.Select(p => new {
p.Id,
p.Name,
p.CreateDate
}));