我有一个JSONP WCF端点,我正在尝试追踪我收到504错误的原因。
HTTP / 1.1 504 Fiddler - 收到失败
内容类型:text / html
连接:关闭
时间戳:11:45:45:9580
ReadResponse()失败:服务器未返回此请求的响应。
我可以在我的Endpoint内部的任何地方设置一个断点,逐步执行代码,看到它成功收集响应所需的数据,点击最后一行代码,然后一旦我退出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>
正如我所说,代码一直在运行,因此我试图找出它为什么不发送响应。
答案 0 :(得分:31)
对不起,我没有直接的解决方案,但在追逐与WCF相关的问题时,我发现打开WCF跟踪日志,运行场景,然后查看日志SvcTraceViewer.exe有助于...你可以获得对堆栈的一些可见性,这可能是你遇到的问题。
您可以使用“WCF Service Configuration Editor”打开/关闭各种日志设置和级别。
答案 1 :(得分:8)
我只是遇到了类似的问题,跟踪是确定它的唯一方法(正如@Tyler已经建议的那样)。我还从服务器返回了HTTP 504,并在Visual Studio中调试服务没有显示任何异常。实际上,从调试器看起来服务正确地返回了响应。
在我的特定情况下,错误的原因是我的数据协定类的一个成员是枚举类型,并且值没有使用EnumMemberAttribute标记。
答案 2 :(得分:5)
对于这个特殊问题,它最终成为我的连接字符串。在Web服务中,它并没有从网站的配置文件中提取。通过一点点魔术(硬编码),我得到了Context以最终激活并且系统开始工作。还没完全通过这个504,因为我现在有其他潜在的错误突然出现 - 在我想出来的时候会继续这个答案。
2/1/2010 - 一旦我清除了连接字符串错误,我发现了一些非常快速清理的基本EF错误。它现在又重新启动了。
答案 3 :(得分:4)
我有几次同样的问题:
在一个场景中,其中一个公共财产(DataMember)只有 吸气,没有二传手。将DataMember更改为同时具有getter 并且setter解决了这个问题。
在另一个场景中,我将EF4 POCO(填充了导航属性)序列化/反序列化为JSON,这在反序列化过程中导致了一个递归循环。将POCO的属性更改为[DataContract(IsReference = true)]
有助于解决递归循环问题,但由于DataContractJsonSerializer不支持引用,因此我必须将格式切换为XML。 ( P.S。 - 使用WEB API,默认的JSON序列化程序将是JSON.NET,它可以毫无问题地处理引用。)
提示:正如其他人所建议的那样,WCF Trace Logging是您解决504错误的朋友。
答案 4 :(得分:4)
希望这会对某人有所帮助。我有一个WCF休息服务返回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 };
}
}
答案 5 :(得分:2)
与上面的odyth有同样的问题和senario。在我的情况下,NULL
属性是NULL
在响应类中的原因,Fiddler如何引起504响应。 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; }
}
字符串属性没有问题。
TimePicker
答案 6 :(得分:0)
如果它对任何人有任何帮助,我试图从Web Api返回一个Entity Framework 4`EntityObject'列表。为了解决这个问题,我只是做了一个明确的选择,因为EntityObject不喜欢被序列化。
return Request.CreateResponse(HttpStatusCode.OK, people.Select(p => new {
p.Id,
p.Name,
p.CreateDate
}));