WCF - (504) 服务器没有为此请求返回响应
Posted
技术标签:
【中文标题】WCF - (504) 服务器没有为此请求返回响应【英文标题】:WCF - (504) The server did not return a response for this request 【发布时间】:2011-01-10 13:21:09 【问题描述】:我有一个 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(@"0flash/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】:很抱歉,我没有直接的解决方案,但是在追查与 WCF 相关的问题时,我发现打开 WCF 跟踪日志,运行场景,然后查看日志SvcTraceViewer.exe 有帮助...您将了解堆栈,这可能是您遇到问题的地方。
您可以使用“WCF Service Configuration Editor”打开/关闭各种日志设置和级别。
【讨论】:
我在实体框架上看到一些奇怪的行为,没有加载请求的上下文。我刚刚遇到了类似的问题,追踪是识别它的唯一方法(正如@Tyler 已经建议的那样)。我还从服务器返回了 HTTP 504,并且还在 Visual Studio 中调试了服务没有显示任何异常。事实上,从调试器看来,服务正确地返回了响应。
在我的特定情况下,错误的原因是我的数据协定类的成员之一是枚举类型,并且值没有用 EnumMemberAttribute 标记。
您可以找到有关在 WCF here 中配置跟踪以及有关 WCF 服务数据协定 here 中的枚举的更多信息。
【讨论】:
+1 用于在 WCF 链接中配置跟踪。它帮助我找到了问题。对我来说,这是一个没有用 DataContract 属性标记的类。【参考方案3】:对于这个特殊问题,它最终成为我的连接字符串。在 Web 服务中,它不是从网站的配置文件中提取的。通过一点魔法(硬编码),我终于激活了上下文,系统开始工作。还没有完全通过这个 504,因为我现在弹出了其他潜在的错误 - 当我弄清楚时会继续这个答案。
2/1/2010 - 清除连接字符串错误后,我发现了几个基本的 EF 错误,这些错误很快就被清除了。它现在重新启动并运行。
【讨论】:
【参考方案4】:我有几次同样的问题:
在一种情况下,公共属性之一 (DataMember) 仅具有 吸气剂,没有二传手。更改该 DataMember 以具有两个 getter setter 解决了这个问题。
在另一种情况下,我正在序列化/反序列化 EF4 POCO(填充了导航属性)到 JSON/从 JSON 序列化/反序列化,这在反序列化过程中导致了递归循环。将 POCO 的属性更改为 [DataContract(IsReference = true)]
有助于解决递归循环问题,但由于 DataContractJsonSerializer 不支持引用,因此我不得不将格式切换为 XML。 (P.S. - 使用 WEB API,默认 JSON 序列化程序将是 JSON.NET,它将毫无问题地处理引用)。
提示:正如其他人所建议的,WCF Trace Logging 是您解决 504 错误的朋友。
【讨论】:
【参考方案5】:希望这会对某人有所帮助。我有一个 WCF 休息服务返回 JSON,fiddler 给了我一个 504,ReadResponse() failed: The server didn't return a response for this request.
我的问题是我返回的模型是这样的:
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 ;
【讨论】:
【参考方案6】:遇到与上述 odyth 相同的问题和情景。在我的情况下,DateTime
属性是如何在响应类中的NULL
,如何导致 Fiddler 的 504 响应。 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】:如果对任何人有任何帮助,我在尝试从 Web Api 返回 Entity Framework 4 `EntityObject' 列表时遇到了这个问题。为了解决这个问题,我只是让它做了一个明确的选择,因为 EntityObject 不喜欢被序列化。
return Request.CreateResponse(HttpStatusCode.OK, people.Select(p => new
p.Id,
p.Name,
p.CreateDate
));
【讨论】:
以上是关于WCF - (504) 服务器没有为此请求返回响应的主要内容,如果未能解决你的问题,请参考以下文章